簡體   English   中英

如何編寫自定義比較器以使用 SimpleEntry 對樹集進行排序?

[英]How to code a custom Comparator to sort a Treeset with SimpleEntry?

我目前正在處理一個要求我使用 Treeset 對值對進行排序的作業。 我被要求使用 SimpleEntry。 我將它們存儲在 Treeset 上:

    TreeSet treeSet = new TreeSet(new PairComparator());
    SimpleEntry pair = new SimpleEntry(weight,source);
    treeSet.add(pair);

這是我的自定義比較器:

static class PairComparator implements Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {

        @Override
        public int compare(AbstractMap.SimpleEntry<Integer,Integer> o1, AbstractMap.SimpleEntry<Integer,Integer> o2) {
            int key1 = o1.getKey() ;
            int key2 = o2.getKey();
            return key1 - key2;
        }
    }

我收到一個我不明白的錯誤,即:

class java.util.HashMap cannot be cast to class java.lang.Integer

你能解釋一下發生了什么嗎? 我對定義自定義比較器並不完全熟悉。

感謝您的關注 !

編輯:我在我的 SimpleEntry 上添加了 Hashmap 作為鍵,而不是 integer,這現在很明顯......

似乎您以某種方式添加了 HashMap 作為 TreeSet 中 SimpleEntries 之一的鍵。

請顯示一個完整的可運行示例。

這段代碼對我有用:

import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
import java.util.Comparator;
import java.util.TreeSet;

public class Main {

    static class PairComparator implements Comparator<SimpleEntry<Integer, Integer>> {

        @Override
        public int compare(SimpleEntry<Integer, Integer> o1, SimpleEntry<Integer, Integer> o2) {
            int key1 = o1.getKey();
            int key2 = o2.getKey();
            return key1 - key2;
        }
    }

    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet(new PairComparator());
        treeSet.add(new SimpleEntry(42, 69));
        treeSet.add(new SimpleEntry(37, 65));
        treeSet.add(new SimpleEntry(23, 19));
        treeSet.add(new SimpleEntry(54, 12));
        System.out.println(treeSet);
    }
}

您沒有指定TreeSet和其他一些數據結構的類型,但我在這里做了,它工作得很好。 我確實改變了你的比較器。 減去 integer 值來進行比較不是一個好主意,因為它可能會導致大量問題。

        
TreeSet<SimpleEntry<Integer, Integer>> treeSet =
        new TreeSet<>(new PairComparator());

Random r = new Random(23);
for (int i = 0; i < 10; i++) {
    int weight = r.nextInt(100);
    int source = r.nextInt(100);
    
    SimpleEntry<Integer, Integer> pair =
            new SimpleEntry<>(weight, source);
    treeSet.add(pair);
}

treeSet.forEach(System.out::println);

打印以下內容(忽略重復鍵)

18=43
22=17
24=30
27=48
81=95
83=47
89=70
90=10
94=87

比較器

static class PairComparator implements
        Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {
    public int compare(
            AbstractMap.SimpleEntry<Integer, Integer> o1,
            AbstractMap.SimpleEntry<Integer, Integer> o2) {
        int key1 = o1.getKey();
        int key2 = o2.getKey();
        return key1 < key2 ? -1 : key1 > key2 ? 1 : 0;
    }
}

您還可以將以下內容指定為比較器。

Comparator<AbstractMap.SimpleEntry<Integer,Integer>> pairComparator =
     (se1,se2)-> Integer.compare(se1.getKey(),se2.getKey());
        

暫無
暫無

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

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