0

頻度に基づいて単語のリストを並べ替える必要があります。

私の入力:

Haha, hehe, haha, haha, hehe, hehe.... , Test

たとえば、私のデータ構造では

Haha:3
Hehe:5
Test:10 

この方法で出力時にデータ構造をソートする必要があります。

Test:10
Hehe:5
Haha:3

データ構造の先頭をポップすると、要素とそれに対応する周波数を取得できるようになります。

要素の数は最初は不明であるため、配列は実行できません。上位のいくつかの要素を取得したい場合は、順次アクセスする必要があります。これはJavaで可能ですか?

4

3 に答える 3

2

最初に確認したいのは、並べ替える前に単語全体を取得できますか? それとも、これらの言葉が連続して流れてきますか?

(1)前者の場合、 a を使用しSetて単語を保存し、それらを a に入れることができますPriorityQueue。比較関数を実装すると、キューは自動的に単語を並べ替えます。テキストと頻度を格納する新しいクラスを作成しPairます。コードを参照してください。

import java.util.Queue;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.HashSet;
import java.util.Comparator;

public class PriorityQueueTest {

    public static class Pair {
        private String text;
        private int frequency;

        @Override
        public int hashCode() {
            return text.hashCode();
        }

        @Override
        public String toString() {
            return text + ":" + frequency;
        }

        public Pair(String text, int frequency) {
            super();
            this.text = text;
            this.frequency = frequency;
        }

        public String getText() {
            return text;
        }
        public void setText(String text) {
            this.text = text;
        }
        public int getFrequency() {
            return frequency;
        }
        public void setFrequency(int frequency) {
            this.frequency = frequency;
        }
    }

    public static Comparator<Pair> idComparator = new Comparator<Pair>(){
        @Override
        public int compare(Pair o1, Pair o2) {
            if(o1.getFrequency() > o2.getFrequency()) {
                return -1;
            }
            else if(o1.getFrequency() < o2.getFrequency()){
                return 1;
            }
            else {
                return 0;
            }
        }
    };

    public static void main(String[] args) {
        Set<Pair> data = new HashSet<Pair>();
        data.add(new Pair("haha", 3));
        data.add(new Pair("Hehe", 5));
        data.add(new Pair("Test", 10));

        Queue<Pair> queue = new PriorityQueue(16, idComparator);

        for(Pair pair : data) {
            queue.add(pair);
        }

        // Test the order
        Pair temp = null;
        while((temp = queue.poll()) != null) {
            System.out.println(temp);
        }

    }

}

(2)それ以外の場合(単語が連続して来る場合)は、 a を使用しTreeMapて順序を保つことができます。ref を参照してください: http://www.java-samples.com/showtutorial.php?tutorialid=370

于 2014-03-22T04:45:47.777 に答える
1
  1. リスト項目

以下の URL を参照として開始し、その参照に基づいて作成します。

Pythonでリスト項目の出現をカウントするにはどうすればよいですか?

今、建物が始まります:

>>> from collections import Counter
>>> word_list = ['blue', 'red', 'blue', 'yellow', 'blue', 'red','white','white']
>>> Counter(word_list)
Counter({'blue': 3, 'red': 2, 'white': 2, 'yellow': 1})

Counter(word_list) が要素のリストを表示する方法に注意してください。つまり、単語/頻度のペアが頻度の高い順に並べ替えられます。残念ながら、単語を抽出して同じ順序でソートされたリストにコンパイルするには、もう少し手間がかかります。

(1) JSON オブジェクトの要素数として「サイズ」を取得します。

(2) JSON オブジェクトに「most_common」メソッドを適用して、頻度でソートされた要素の配列を取得します。

(3) リスト内包表記を適用して、ソートされた配列から抽出された単語のリストを生成します。

>>> size = len(Counter(word_list))
4
>>> word_frequency_pairs = Counter(word_list).most_common(size)
>>> word_frequency_pairs
[('blue', 3), ('white', 2), ('red', 2), ('yellow', 1)]
>>> [i[0] for i in word_frequency_pairs]
['blue', 'white', 'red', 'yellow']

私が Python を愛するのには理由があります :)

于 2014-03-22T04:56:50.993 に答える
1

必要な情報を保持するには、文字列とカウント (例: ) を保持するクラスを作成し、このPairクラスのインスタンスをList<Pair>. このアプローチでは、文字列を保持する要素を線形時間 ( O(N) )で探してインクリメントする必要があるため、特定の文字列のカウントのインクリメントが非効率的になります。

より良いアプローチは、 a を使用することです。これにより、一定時間 ( O(1)Map<String, Integer> )で検索が行われ、返された byの要素を並べ替えることができます。Set<Map.Entry<String, Integer>>Map.entrySet()

于 2014-03-22T03:37:39.957 に答える