簡體   English   中英

嘗試使用比較器對 ArrayList 進行排序

[英]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,這意味着根據此比較器,它們都是等效的,並且列表將保留其順序。

您可以通過不使用-實現比較器來解決此問題,而是通過重用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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM