簡體   English   中英

對兩個列表進行排序

[英]Sorting two lists

我在用Java工作。 我有兩個列表,我們稱它們為A和B,我想對其進行排序。 A是一個整數列表,因此我沒有問題。 我只是使用Collections.sort()來獲取整數的排序列表。 問題來自列表B。我想在A中進行相同的更改 B是對象列表,但是無法將B中的更改與A中的更改相關聯。我的意思是, 沒有條件可以創建比較器方法

小例子:

我有:

A -> {5,1,3,6,4}
B -> {a,b,c,d,e}

我想對A進行排序並將相同的更改應用於B以獲得:

A -> {1,3,4,5,6}
B -> {b,c,e,a,d}

有什么辦法可以使用內置的Java函數來做到這一點? 由於效率,我寧願自己避免編寫排序算法。 謝謝!

我首先創建一個POJO來存儲AB

static class ABPojo implements Comparable<ABPojo> {
    public ABPojo(int a, String b) {
        this.a = a;
        this.b = b;
    }

    private int a;
    private String b;

    public int getA() {
        return a;
    }

    public String getB() {
        return b;
    }

    public int compareTo(ABPojo o) {
        if (o instanceof ABPojo) {
            ABPojo that = (ABPojo) o;
            return Integer.valueOf(a).compareTo(that.getA());
        }
        return 1;
    }
}

然后,您可以在排序后ABPojo的集合,以使用以下內容構建輸出

public static void main(String[] args) {
    List<ABPojo> al = new ArrayList<ABPojo>();
    al.add(new ABPojo(5, "a"));
    al.add(new ABPojo(1, "b"));
    al.add(new ABPojo(3, "c"));
    al.add(new ABPojo(6, "d"));
    al.add(new ABPojo(4, "e"));
    Collections.sort(al);
    StringBuilder a = new StringBuilder();
    StringBuilder b = new StringBuilder();
    for (ABPojo pojo : al) {
        if (a.length() > 0) {
            a.append(",");
        } else {
            a.append("{");
        }
        if (b.length() > 0) {
            b.append(",");
        } else {
            b.append("{");
        }
        a.append(pojo.getA());
        b.append(pojo.getB());
    }
    a.append("}");
    b.append("}");
    System.out.println("A -> " + a.toString());
    System.out.println("B -> " + b.toString());
}

輸出是要求的

A -> {1,3,4,5,6}
B -> {b,c,e,a,d}

TreeMap始終會以正確的順序遍歷鍵,因此您可以這樣操作:

 Map<Integer, String> map = new TreeMap<Integer, String>();
 map.put(5, "a");
 map.put(1, "b");
 map.put(3, "c");
 map.put(6, "d");
 map.put(4, "e");
 System.out.println(map.keySet());
 System.out.println(map.values());

但是,如果您真的想以相同的一對List實例開始和結束,我認為您必須做一些復雜的事情:

 List<Integer> numbers = new ArrayList<Integer>(Arrays.asList(5, 1, 3, 6, 4));
 List<String> letters = new ArrayList<String>(Arrays.asList("a", "b", "c", "d", "e"));
 Map<Integer, String> map = new HashMap<Integer, String>();
 for (int i = 0, n = numbers.size(); i < n; i++) {
     map.put(numbers.get(i), letters.get(i));
 }
 Collections.sort(numbers);
 letters.clear();
 for (int number : numbers) {
     letters.add(map.get(number));
 }
 System.out.println(numbers);
 System.out.println(letters);

創建一個map ,將A中的元素作為key ,B中的元素作為value 然后Collections.Sort()將自動對A元素及其對應的B元素進行排序。

從這里開始:

如何在Java中找到排序的排列

然后手動應用排列。

但這聽起來像是一個設計問題。 考慮一個實現Comparator<T>的類的列表,其中比較函數僅位於數字上。

我認為沒有Java函數可以做到這一點。

但是,您可以使用映射結構代替列表結構,在列表結構中,數據的關鍵是您的int,數據是不可排序的列表。

暫無
暫無

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

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