当前位置: 首页 > 知识库问答 >
问题:

如何在不知道对象类型的情况下比较两个对象

弘和同
2023-03-14

我正在实现一个排序列表类,在这个类中,我将对任何类型的对象进行排序,所以现在我想测试对象是否具有可比性,

我用这段代码覆盖了compareTo()方法:-

class MyObject implements Comparable {

Object ob;

    MyObject(){
        this.ob=new Object();
    }

    public int compareTo(Object current){
        if((ob.toString().compareTo(current.toString()))>1)
        return 1;
        else if((ob.toString().compareTo(current.toString()))<1)
        return -1;
        else
        return 0;

    }

    public String toString(){

        return (String)ob;
    }
}

所以现在我需要给这些对象分配数字,像这样

class SortedListTest{
    public static void main (String arg[]){

        MyObject b1= new MyObject();
        MyObject b2= new MyObject();

        b1.ob=6;
        b2.ob=3;

        System.out.println(b2.compareTo(b1));
    }

}

但它总是给我一个例外:-

线程“main”中出现异常Java . lang . classcastexception:Java . lang . integer不能转换为java.lang.String

共有3个答案

昝存
2023-03-14

在许多情况下,在不知道对象类型的情况下对对象进行排序是没有意义的。然而,在某些情况下,您可能希望按类型等对对象进行分组(尽管不同类型的存储(如地图等)可能更适合这种情况)。

问题是,在不知道对象类型的情况下,您所能做的是有限的。但您的比较器可以执行以下操作:

  • 检查被比较的对象是否实现了可比并在其中调用compareTo()方法。
  • 如果它们属于同一类型/类别,那么它们可能相等或不相等(取决于您的要求)。如何比较这些取决于您。
  • 如果类型不同,您可以尝试按类名等进行比较。

话虽如此,您应该真正考虑一下您是否真的需要它,因为您可以依赖的少量信息很难做到这一点。

仲皓君
2023-03-14

您报告的问题是

return (String)ob;

应该是

return ob.toString();

如果 ob 从不为空;或

return Objects.toString(ob);

如果可能是的话。

但请注意,不需要将对象包装在对象中以将其toString()进行比较。您可以简单地使用Comparator

int order = Ordering.usingToString().compare(someObject, someOtherObject);

或者其他类似的Java 8。我想应该是这样的:

Comparator<Object> usingToString = (a, b) -> a.toString().compareTo(b.toString());
int order = usingToString(someObject, someOtherObject);

林星阑
2023-03-14

从概念上讲,这根本没有意义!

要点是:当您允许列表中有任意类型的对象时,那么“排序”这个概念在这里就没有任何意义了。

因此,简单的回答是:忘掉它。

严格来说,你的问题在这里:

return (String)ob;

该代码假定obj是String。但当你考虑到任何类型的对象时,这不一定是真的。所以obj。toString()可以防止运行时问题,但是;正如所说:解决技术问题并不是真正的答案。

让我们回到一个真实的例子:假设你被要求对桌子上的东西进行分类:勺子,刀,杯子,香蕉,苹果。你打算如何做到这一点?

如果有的话,你可以收回所有共同点;比如“重量”。所以你把所有的东西都放在天平上;然后用它来“分类”它们。

从Java的角度来看,对象的唯一共同点是字符串表示(当对它们调用< code>toString()时)或数值表示(当调用< code>hashCode()时)。因此,您可以对这些属性进行“排序”。这可以工作,但不会产生任何有用的东西。

换句话说:当您打算对列表的内容进行排序时,除了只允许列表中的“相同类型的对象”之外,没有其他方法。这就是java集合完全以这种方式工作的原因。从某种意义上说:使用泛型来表示该列表

 类似资料:
  • 我有两个对象类Person和Employee。两个类都有共同的属性年龄。我已经在Arraylist中添加了这两个类的几个对象,现在我需要两个,写一个比较器,并将其传递给集合类的sort方法。并希望列表按年龄排序。我尝试这样做只是为了更清楚地使用Java中的carparable和Comparator。 编辑:我问这个问题的原因是我不清楚比较者和可比性。我在某个地方读到,如果类实现了可比较的,那么它就

  • 问题内容: 在Django中,当您有一个父类和从其继承的多个子类时,通常可以通过parentclass.childclass1_set或parentclass.childclass2_set访问一个子类,但是如果我不知道我想要的特定子类的名称怎么办? 有没有一种方法可以在不知道子类名称的情况下沿parent-> child方向获取相关对象? 问题答案: (更新:对于Django 1.2及更高版本,

  • 问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:

  • 问题内容: 我得到的错误就在这行 。 该怎么办?其他逻辑还可以吗? 我想做的是有一个A列表和一个B列表,其中一个属性与id相同;尽管变量名不同。即在和在B。现在我将两个列表都放在ListAll中,并在相同的变量id / bid上对它们进行排序。我有A和B实现可比性。 和我的listAll是对象类型? 我该怎么做?谢谢。 问题答案: 您可以添加一个通用基类并在那里进行比较,如下所示:

  • 在爪哇中。如果我们必须将一个对象与另一个对象进行比较。我们比较该对象中的每个字段。 学生 1 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。学生 2 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。因此,要检查2名学生是否相等...我们比较每个字段。 但是,如果 Student 对象有许多字段,该怎么办?学生1对象有标记1,标记2,标记3,名称,年龄,地址,颜色,类,国家,部

  • 假设我有两个列表,现在listOld包含旧员工信息,listNew包含新员工信息 我如何比较这两个列表并返回新列表,其中包含,添加的新员工列表,包含,删除的员工列表,包含上次更新已更改的员工的新列表? 我只能想到迭代列表和比较,可能最终几乎是O(n2)时间,这可以由任何util类更有效地完成吗?