web-dev-qa-db-ja.com

キーと値を優先キューに追加し、Java

文字列のリストを取り込んで、キーと値を含む優先度キューに追加しようとしています。キーは単語であり、値は単語の文字列値です。次に、最初に文字列値が最も高いキューを並べ替える必要があります。優先キューでは、2つの値を追加できません。

public static List<String> pQSortStrings(List<String> strings) {
    PriorityQueue<String, Integer> q = new PriorityQueue<>();

    for (int x = 0; x < strings.size(); x++) {
        q.add(strings.get(x),calculateStringValue(strings.get(x)));
    }
    return strings;
}
7
user3072188

問題

PriorityQueue 各ノードに単一のオブジェクトを格納できます。ですから、あなたがやろうとしていることは、そのままではできません。

ただし、両方のオブジェクトを1つのクラスで構成してから、PriorityQueueを使用できます。

Comparator を指定するか、 Comparable インターフェイスを実装して 自然順序付け に依存する必要があります。


解決

  • Stringintをメンバーとするクラスを作成します。

    public class Entry {
        private String key;
        private int value;
    
        // Constructors, getters etc.
    }
    
  • Comparableインターフェースを実装し、比較をStringに委任します。

    public class Entry implements Comparable<Entry> {
        private String key;
        private int value;
    
        public Entry(String key, int value) {
            this.key = key;
            this.value = value;
        }
    
        // getters
    
        @Override
        public int compareTo(Entry other) {
            return this.getKey().compareTo(other.getKey());
        }
    }
    
  • このクラスを使用してPriorityQueueを構築します。

    PriorityQueue<Entry> q = new PriorityQueue<>();
    
  • 次のように要素を追加します。

    q.add(new Entry(strings.get(x), calculateStringValue(strings.get(x))));
    

お役に立てれば。

17
Tanmay Patil

Java-8の使用

PriorityQueue<Map.Entry<String, Integer>> queue = new PriorityQueue<>((a, b)->b.getValue()-a.getValue());

新しいエントリを追加するには

queue.offer(new AbstractMap.SimpleEntry<>("A", 10));
1
Ankit Sharma