Java 每次使用不同排序属性的compareTo()方法
我使用方法Java 每次使用不同排序属性的compareTo()方法,java,android,sorting,arraylist,Java,Android,Sorting,Arraylist,我使用方法compareTo()对名为image的自定义对象的ArrayList进行排序,但在我的应用程序中,有时我需要根据特定属性(如goodMatches)对数组进行排序,有时我需要根据对象的其他属性对数组进行排序,但对于不同的排序,我不能多次重写compareTo()方法 我已经尝试对对象使用flags属性,但问题是其他属性是float类型的,我需要将方法compareTo保留为将float not integer返回为goodMatches。如果有人能帮助我克服这个问题而不需要创建另一个
compareTo()
对名为image
的自定义对象的ArrayList
进行排序,但在我的应用程序中,有时我需要根据特定属性(如goodMatches
)对数组进行排序,有时我需要根据对象的其他属性对数组进行排序,但对于不同的排序,我不能多次重写compareTo()
方法
我已经尝试对对象使用flags属性,但问题是其他属性是float类型的,我需要将方法compareTo
保留为将float not integer返回为goodMatches
。如果有人能帮助我克服这个问题而不需要创建另一个对象类,我们将不胜感激,下面是我的compareTo()
:
给定以下
图像
类(类名称使用大写)
您可以为每个属性创建一个:
class GoodMatchesComparator implements Comparator<Image> {
@Override
public int compare(Image i1, Image i2) {
return Integer.compare(i1.getGoodMatches(), i2.getGoodMatches());
}
}
class AnotherPropertyComparator implements Comparator<Image> {
@Override
public int compare(Image i1, Image i2) {
return Float.compare(i1.getAnotherProperty(), i2.getAnotherProperty());
}
}
不要重写
compareTo()
尝试创建一个名为Comparator
的类,该类通过传递ICompare的实现来创建一个Comparator(一个确定哪个对象具有更高优先级的判断器)
public interface ICompare{
compare(image obj1, image obj2);
}
竞赛者级别:
public class Comperator{
ICompare icompare;
Comperator(ICompare icompare){
this.icompare = icompare;
}
public int compare(image img1, image img2){
return icompare.compare(img1,img2);
}
}
总之,通过传递所需的实现接口,创建所需数量的Comperator对象。然后使用它来比较image类型的对象
我想在这里告诉你,你可以在这里使用泛型,但我没有,只是因为我想让它简单明了 您需要创建自定义比较器能否澄清以下语句:“对于不同的排序,我不能多次重写compareTo()方法”?我假设您在代码中的不同位置调用
sort
,那么您不能为每个用例定义不同的Comparator
s吗?@Sindbad90当使用“实现可比”时,compareTo已经实现了,例如我的例子:public class image实现了可比{},因此,我无法为其他排序类型编写第二个或第三个比较器谢谢你的回答,但如果我将此代码放在object类或mainActivity中,并且我需要排序始终按降序排列,你可以将比较器放在它们自己的文件中,它们就是类。并在任何需要的地方使用排序。我将添加一个反向顺序的代码段非常感谢,您的代码似乎正常工作,我将尝试它并返回给您抱歉Anoyy,但是我如何才能返回float而不是int?如果我使用float,他们说类型是兼容的使用float.compare
而不是Integer.compare
List<Image> images = new ArrayList<>();
// populate your list
// sort the list based on the goodMatches property
images.sort(new GoodMatchesComparator());
// sort the list based on the anotherProperty property
images.sort(new AnotherPropertyComparator());
images.sort(new GoodMatchesComparator().reversed());
public interface ICompare{
compare(image obj1, image obj2);
}
public class Comperator{
ICompare icompare;
Comperator(ICompare icompare){
this.icompare = icompare;
}
public int compare(image img1, image img2){
return icompare.compare(img1,img2);
}
}