1

挿入ソートアルゴリズムを使用して配列をソートしようとしています。配列には、フィールド (テキスト ファイルから入力) とフィールド (特定の単語がテキスト ファイルに出現する回数を測定するため)WordNodeを含む要素が格納されます。単語が頻度 (最低から​​最高) で並べ替えられるように並べ替えを実装しましたが、頻度が等しい場合はアルファベット順に並べ替えたいと考えています。2 つの異なる基準を同時に使用して並べ替えるにはどうすればよいですか? 以下は私のソートコードです。wordfrequency

public static void sort(ArrayUnorderedList<WordNode> array) {
    //create stacks for insertion sort
    LinkedStack<WordNode> sorted = new LinkedStack<WordNode>();
    LinkedStack<WordNode> temp = new LinkedStack<WordNode>();

    //while the array has elements to be sorted
    while(!array.isEmpty()) {
        //remove current element from array
        WordNode currentNode = array.removeFirst();

        //while the sorted stack meets sorting criteria
        while((!sorted.isEmpty()) && (sorted.peek().getFrequency() < currentNode.getFrequency())) {
            //push elements to temp stack
            temp.push(sorted.pop());
        }

        //push current element to sorted stack
        sorted.push(currentNode);

        //while the temp stack has elements to be replaced
        while(!temp.isEmpty()) {
            //push elements to sorted stack
            sorted.push(temp.pop());
        }
    }

    //replace sorted elements in array
    while(!sorted.isEmpty()) {
        array.addToRear(sorted.pop());
    }
}
4

4 に答える 4

1

AppClay の答えは完全に正しいですが、「片付け」に興味がある場合は、Comparatorを実装するヘルパーを作成してください。

class WordNodeComparator implements Comparator<WordNode> {
    @Override
    public int compare(WordNode lhs, WordNode rhs) {
        int result = lhs.getFrequency() - rhs.getFrequency();
        if (result == 0) {
            return lhs.getWord().compareTo(rhs.getWord());
        }
        else {
            return result;
        }
    }
}

次に、そのインスタンスを作成し、ループで使用します。

while((!sorted.isEmpty()) && (nodeComparator.compare(sorted.peek(), currentNode) < 0)

これにより、コードが読みやすくテストしやすくなるだけでなく、必要に応じてさまざまな Comparator 実装を簡単に交換できるようになりました。

于 2012-04-13T02:14:11.450 に答える
0

Guava libを使用します:

    public static List<WordNode> sort(List<WordNode> src){
       List<WordNode> result = Lists.newArrayList(src);
       Collections.sort(result, new Comparator<WordNode>(){
           @Override public int compare(WordNode w1, WordNode w2) {
             return ComparisonChain.start()  
                     .compare(w1.frequency, w2.frequency)  
                     .compare(w1.word     , w2.word) 
                     .result(); 
        }});
       return result;
     }
于 2012-04-13T02:36:06.193 に答える