尝试使用比较器对数组列表进行排序



在下面的代码中,对象someObj有两个属性,一个float x和一个int pnt。创建一个ArrayList<someObj>,然后使用Comparator接口根据x进行排序。属性pnt旨在跟踪排序后的元素。

我已经从https://www.geeksforgeeks.org/collections-sort-java-examples/复制了代码根据我的需要稍微修改了一下。我想知道是哪里出了问题,它就是没有完成它的排序工作。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Random;
public class ArrayListSorting {
public static void main(String[] args) {

// 20 random numbers will be used for the test
final int sz=20;
Random rand = new Random();

ArrayList<someObj> oList=new ArrayList<someObj>();

// Build the list
for(int i=0;i<sz;i++) {
oList.add(new someObj(i,rand.nextFloat()));
}

// Print the list before sorting
for(int i=0;i<sz;i++) {
System.out.println(i+"t"+oList.get(i).getX());
}
Collections.sort(oList, new sorter());
// ...and after sorting
for(int i=0;i<sz;i++) {
int j=oList.get(i).getPnt();
System.out.println(j+"t"+oList.get(i).getX());
}
}
}
class someObj {
private float x;
private int pnt;

public someObj(int pnt,float x) {
this.pnt=pnt;
this.x=x;
}

public int getPnt() {
return pnt;
}

public float getX() {
return x;
}
}
class sorter implements Comparator<someObj> {

public int compare(someObj a, someObj b) {
return (int)(a.getX() - b.getX());
}
}

nextFloat()将生成一个范围为[0,1]的float,通过在比较器中减去任意两个这样的值,您将得到一个范围为(- 1,1)的值。当您将其强制转换为int时,您将得到一个0,这意味着根据这个比较器,它们都是等效的,并且列表将保持其顺序。

您可以通过不使用-实现比较器,而是通过重用Floatcompare方法来解决这个问题:

class sorter implements Comparator<someObj> {

public int compare(someObj a, someObj b) {
return Float.compare(a.getX(), b.getX());
}
}

或者更好的是,使用Comparator.comparing动态地创建这个比较器:

Collections.sort(oList, Comparator.comparing(someObj::getX));

编辑:
正如Andy Turner在评论中指出的,Collections.sort有点过时了。从JDK 8开始,列表有自己的sort方法,可以直接调用:

oList.sort(Comparator.comparing(someObj::getX));

相关内容

  • 没有找到相关文章

最新更新