如何对字符串列表进行降序排序,然后再按升序排序(如果并列)?

时间:2018-09-13 01:10:25

标签: java sorting

好的,这个问题可能会让您说“什么?”但请尝试提供一些背景信息。 我正在开发一个程序,该程序读取 plaintext 文件,然后根据该单词出现的次数按降序对文件中的字符串进行排序,然后对出现次数相同的单词进行排序,我必须按字母升序对这些单词进行排序...

现在,我有一个名为“单词”的数组列表,其中包含我打开的文本文件中的每个单词。那么,如果出现联系,我该如何按照出现的单词数的降序对它进行排序,然后按字母顺序升序排序呢?

所以,如果我有一个列表是:

[a, a, a, a, b, c, c, c, c, d, d, e, e, e, e, e]

排序后我的输出列表为:

e : 5
a : 4  // notice the words that occur 4 times are alphabetical sorted
c : 4
d : 2
b : 1

1 个答案:

答案 0 :(得分:0)

根据您的问题。

  

按照单词出现的次数按降序对文件中的字符串进行排序,然后对于出现次数相同的单词,我必须按字母的升序对这些单词进行排序...

这意味着

首先,您需要获取单词的不同列表并计算每个单词的出现次数,这可以使用HashMap来实现。

第二,首先通过出现次数降序排列单词的唯一列表,然后通过字母升序排列,这可以通过实现Comparator并使用Collections.sort方法来实现。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SortOccurrence {
    Map<String, Integer> wordToOccurenceMap = new HashMap<String, Integer>();

    SortOccurrence(List<String> words) {
        // Count occurrence for each word
        for (String word : words) {
            if (!wordToOccurenceMap.containsKey(word)) {
                wordToOccurenceMap.put(word, 0);
            }
            wordToOccurenceMap.put(word, wordToOccurenceMap.get(word) + 1);
        }
    }

    List<String> getSortResult() {
        List<String> distinctWords = new ArrayList<String>(wordToOccurenceMap.keySet());
        Collections.sort(distinctWords, new OccurrenceComparator());
        List<String> sortResult = new ArrayList<String>();
        for (String distinctWord : distinctWords) {
            sortResult.add(distinctWord + " : " + wordToOccurenceMap.get(distinctWord));
        }
        return sortResult;
    }

    public class OccurrenceComparator implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {
            if (!wordToOccurenceMap.containsKey(o1) || !wordToOccurenceMap.containsKey(o2)) {
                throw new IllegalArgumentException("word not occur");
            }
            // if occurrence same, compare the string
            if (wordToOccurenceMap.get(o1).compareTo(wordToOccurenceMap.get(o2)) == 0) {
                return o1.compareTo(o2);
            }
            // compare by occurrence, '-' for descending
            return -wordToOccurenceMap.get(o1).compareTo(wordToOccurenceMap.get(o2));
        }
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList(
                new String[] { "a", "a", "a", "a", "b", "c", "c", "c", "c", "d", "d", "e", "e", "e", "e", "e" });

        SortOccurrence sortOccurence = new SortOccurrence(input);
        System.out.println(sortOccurence.getSortResult());
    }
}