Java 将不同类型的对象与可比对象进行比较
Java 将不同类型的对象与可比对象进行比较,java,list,collections,comparable,Java,List,Collections,Comparable,A.java public class A implements Comparable { private String id; private String name; public A(String a, String b) { id = a; name = b; } public String getId() { return id; } public void setId(Str
A.java
public class A implements Comparable {
private String id;
private String name;
public A(String a, String b) {
id = a;
name = b;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Object o) {
A a = (A) o;
return id.compareTo(a.getId());
}
}
public class B implements Comparable {
private String b_id;
private String other;
public B(String a, String b) {
b_id = a;
other = b;
}
public String getBId() {
return b_id;
}
public void setBId(String id) {
this.b_id = id;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
public int compareTo(Object o) {
B b = (B) o;
return b_id.compareTo(b.getId());
}
}
public class Learn {
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
List<B> listB = new ArrayList<B>();
List<Object> listAll = new ArrayList<Object>();
listA.add(new A("aa", "bb"));
listA.add(new A("ae", "bbn"));
listA.add(new A("dfr", "GSDS"));
listB.add(new B("nm", "re"));
listB.add(new B("asd", "asfa"));
listAll.addAll(listA);
listAll.addAll(listB);
Collections.sort(listAll);
for (Object o : listAll) {
if (o instanceof A)
System.out.println(o.getId);
else if (o instanceof B)
Syatem.out.println(o.getBId);
}
}
}
B.java
public class A implements Comparable {
private String id;
private String name;
public A(String a, String b) {
id = a;
name = b;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Object o) {
A a = (A) o;
return id.compareTo(a.getId());
}
}
public class B implements Comparable {
private String b_id;
private String other;
public B(String a, String b) {
b_id = a;
other = b;
}
public String getBId() {
return b_id;
}
public void setBId(String id) {
this.b_id = id;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
public int compareTo(Object o) {
B b = (B) o;
return b_id.compareTo(b.getId());
}
}
public class Learn {
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
List<B> listB = new ArrayList<B>();
List<Object> listAll = new ArrayList<Object>();
listA.add(new A("aa", "bb"));
listA.add(new A("ae", "bbn"));
listA.add(new A("dfr", "GSDS"));
listB.add(new B("nm", "re"));
listB.add(new B("asd", "asfa"));
listAll.addAll(listA);
listAll.addAll(listB);
Collections.sort(listAll);
for (Object o : listAll) {
if (o instanceof A)
System.out.println(o.getId);
else if (o instanceof B)
Syatem.out.println(o.getBId);
}
}
}
Learn.java
public class A implements Comparable {
private String id;
private String name;
public A(String a, String b) {
id = a;
name = b;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Object o) {
A a = (A) o;
return id.compareTo(a.getId());
}
}
public class B implements Comparable {
private String b_id;
private String other;
public B(String a, String b) {
b_id = a;
other = b;
}
public String getBId() {
return b_id;
}
public void setBId(String id) {
this.b_id = id;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
public int compareTo(Object o) {
B b = (B) o;
return b_id.compareTo(b.getId());
}
}
public class Learn {
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
List<B> listB = new ArrayList<B>();
List<Object> listAll = new ArrayList<Object>();
listA.add(new A("aa", "bb"));
listA.add(new A("ae", "bbn"));
listA.add(new A("dfr", "GSDS"));
listB.add(new B("nm", "re"));
listB.add(new B("asd", "asfa"));
listAll.addAll(listA);
listAll.addAll(listB);
Collections.sort(listAll);
for (Object o : listAll) {
if (o instanceof A)
System.out.println(o.getId);
else if (o instanceof B)
Syatem.out.println(o.getBId);
}
}
}
怎么办?其他的逻辑也行吗
我想做的是有一个a和B的列表,其中一个属性与id相同;虽然变量名不同。i、 eA中的id
和B中的bid
。
现在我将这两个列表放在ListAll中,并在同一个变量id/bid上对它们进行排序。
我有A和B
我的listAll是Object类型的
我该怎么做?
谢谢。我不相信在您告诉的地方会出现异常,而是在调用sort()
不管怎样,它的意思是
“排序方法需要实现可比较的元素的列表
。但您告诉他您正在提供一个对象的列表
,并且并非所有对象都实现可比较。因此,编译器无法确保列表中传递的对象实时实现可比较(根据需要)。”,并抛出一个错误“
解决方案是什么?使用实现可比较的绑定类定义列表
List<A> listAll = new ArrayList<A>();
List listAll=new ArrayList();
更新:要使所有项目都位于同一列表中,请执行以下操作之一:
a) 使所有项都从实现可比较的的公共类/接口派生。通常,这是最适合面向对象编程的方法,因为如果要比较这两个类,它们必须以某种方式相关。或者从A扩展B,从B扩展A,从另一个类扩展A和B,或者使A和B实现另一个接口(其本身实现了可比较的接口)
b) 正如JBNizet所说,使用比较器
同样,我强烈建议使用a解决方案。我不认为在您告诉的地方会出现异常,而是在调用sort()
不管怎样,它的意思是
“排序方法需要实现可比较的元素的列表
。但您告诉他您正在提供一个对象的列表
,并且并非所有对象都实现可比较。因此,编译器无法确保列表中传递的对象实时实现可比较(根据需要)。”,并抛出一个错误“
解决方案是什么?使用实现可比较的绑定类定义列表
List<A> listAll = new ArrayList<A>();
List listAll=new ArrayList();
更新:要使所有项目都位于同一列表中,请执行以下操作之一:
a) 使所有项都从实现可比较的的公共类/接口派生。通常,这是最适合面向对象编程的方法,因为如果要比较这两个类,它们必须以某种方式相关。或者从A扩展B,从B扩展A,从另一个类扩展A和B,或者使A和B实现另一个接口(其本身实现了可比较的接口)
b) 正如JBNizet所说,使用比较器
同样,我强烈建议使用a解决方案。要对列表进行排序,其元素必须相互比较。这里不是这样。A的实例只能与A的其他实例进行比较。B也是如此
如果要对包含a和B实例的列表进行排序,则需要提供Comparator
,它将愉快地接受两个a
s、两个B
s或一个a
和一个B
,并根据需要对这些对象进行比较
public class AOrBComparator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
String o1Id = getId(o1);
String o2Id = getId(o2);
return o1Id.compareTo(o2Id);
}
private String getId(Object o) {
if (o instanceof A) {
return ((A) o).getId();
}
else if (o instanceof B) {
return ((B) o).getId();
}
else {
throw new IllegalArgumentException("Can only get ID from A or B");
}
}
}
公共类AOrBComparator实现Comparator{
@凌驾
公共整数比较(对象o1、对象o2){
字符串o1Id=getId(o1);
字符串o2Id=getId(o2);
返回o1Id.compareTo(o2Id);
}
私有字符串getId(对象o){
如果(A的o实例){
return((A)o.getId();
}
else if(B的o实例){
return((B)o.getId();
}
否则{
抛出新的IllegalArgumentException(“只能从A或B获取ID”);
}
}
}
但是也许A和B应该实现相同的可识别接口,并且列表应该是Alist
。通过这种方式,您可以轻松编写一个比较器来比较两个可识别的实例,无论实际实例是a、B还是任何其他可识别的实例,比较器都可以工作。要对列表进行排序,其元素必须彼此可比。这里不是这样。A的实例只能与A的其他实例进行比较。B也是如此
如果要对包含a和B实例的列表进行排序,则需要提供Comparator
,它将愉快地接受两个a
s、两个B
s或一个a
和一个B
,并根据需要对这些对象进行比较
public class AOrBComparator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
String o1Id = getId(o1);
String o2Id = getId(o2);
return o1Id.compareTo(o2Id);
}
private String getId(Object o) {
if (o instanceof A) {
return ((A) o).getId();
}
else if (o instanceof B) {
return ((B) o).getId();
}
else {
throw new IllegalArgumentException("Can only get ID from A or B");
}
}
}
公共类AOrBComparator实现Comparator{
@凌驾
公共整数比较(对象o1、对象o2){
字符串o1Id=getId(o1);
字符串o2Id=getId(o2);
返回o1Id.compareTo(o2Id);
}
私有字符串getId(对象o){
如果(A的o实例){
return((A)o.getId();
}
else if(B的o实例){
return((B)o.getId();
}
否则{
抛出新的IllegalArgumentException(“只能从A或B获取ID”);
}
}
}
但是也许A和B应该实现相同的可识别接口,并且列表应该是Alist
。通过这种方式,您可以轻松编写一个比较器来比较两个可识别实例,无论实际实例是a、B还是任何其他可识别实例,比较器都可以工作。您可以添加一个公共基类并在其中实现比较,如中所示:
abstract class AandBComparable implements Comparable {
public int compareTo(Object o) {
AandBComparable ab = (AandBComparable) o;
return getId().compareTo(ab.getId());
}
public abstract String getId();
}
您可以添加一个公共基类并在其中实现比较,如中所示:
abstract class AandBComparable implements Comparable {
public int compareTo(Object o) {
AandBComparable ab = (AandBComparable) o;
return getId().compareTo(ab.getId());
}
public abstract String getId();
}
您需要一个基本(虚拟)类,它将实现compariable
,并让a和B从类派生。比如:
public abstract class MyComparableClass implements Comparable {
}
public class A extends MyComparableClass {
... // implementation of compareTo
}
public class B extends MyComparableClass {
...// implementation of compareTo
}
在主程序中,只需将集合定义为:
List<MyComparableClass> listAll = new ArrayList<MyComparableClass>();
List listAll=new ArrayList();
您需要