Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每次使用不同排序属性的compareTo()方法_Java_Android_Sorting_Arraylist - Fatal编程技术网

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);
   }
}