我正在实现一个排序列表类,在这个类中,我将对任何类型的对象进行排序,所以现在我想测试对象是否具有可比性,
我用这段代码覆盖了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
在许多情况下,在不知道对象类型的情况下对对象进行排序是没有意义的。然而,在某些情况下,您可能希望按类型等对对象进行分组(尽管不同类型的存储(如地图等)可能更适合这种情况)。
问题是,在不知道对象类型的情况下,您所能做的是有限的。但您的比较器可以执行以下操作:
可比
并在其中调用compareTo()
方法。话虽如此,您应该真正考虑一下您是否真的需要它,因为您可以依赖的少量信息很难做到这一点。
您报告的问题是
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);
从概念上讲,这根本没有意义!
要点是:当您允许列表中有任意类型的对象时,那么“排序”这个概念在这里就没有任何意义了。
因此,简单的回答是:忘掉它。
严格来说,你的问题在这里:
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类更有效地完成吗?