[英]Trying to sort an ArrayList using Comparator
在下面的代碼中, object 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,這意味着根據此比較器,它們都是等效的,並且列表將保留其順序。
您可以通過不使用-
實現比較器來解決此問題,而是通過重用Float
的compare
方法:
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.