Java:按长度对单词列表进行排序,然后按字母顺序排序

use*_*517 4 java sorting map

有人告诉我有一个按长度排序的单词列表,而那些长度相同的单词按字母顺序排序。到目前为止,这就是我所拥有的方法。

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    TreeMap<String, Integer> s = new TreeMap<String, Integer>();
    ArrayList<Integer> count = new ArrayList<Integer>();
    String line;        
    int length;
    while ((line = r.readLine()) != null) {
        length = line.length();

        s.put(line, length);
        if (!count.contains(length)){
            count.add(length);
        }
    }    
    Collections.sort(count);
    System.out.println(count);
}
Run Code Online (Sandbox Code Playgroud)

我的想法是使用 TreeMap 来保留字符串,并以单词的长度作为键。我还有一个 ArrayList 可以跟踪所有单词的长度,没有任何重复,然后对其进行排序。

我希望以某种方式调用 TreeMap 的键值为 5,它会列出所有包含 5 个字母的单词。

我想知道我是否在正确的轨道上?我已经玩了一个多小时,似乎无法弄清楚在这之后我应该做什么。我是从正确的角度接近这个吗?

rad*_*dai 5

您想使用按长度 1 进行比较的字符串比较器。像这样:

public class LengthFirstComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {             
        if (o1.length()!=o2.length()) {
            return o1.length()-o2.length(); //overflow impossible since lengths are non-negative
        }
        return o1.compareTo(o2);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你可以通过调用简单地对你的字符串进行排序 Collections.sort(yourStringList, new LengthFirstComparator());


Sua*_*ehi 4

最简单的方法是编写一个Comparator<String>. 将Comparator<String>接收两个单词,并对它们进行比较。如果第一个比第二个短,则应返回 -1。如果第二个比第一个短,则返回 1。如果它们的长度相同,则应调用默认String compareTo方法。然后,您可以使用此自定义对列表进行简单排序Comparator