有人告诉我有一个按长度排序的单词列表,而那些长度相同的单词按字母顺序排序。到目前为止,这就是我所拥有的方法。
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 个字母的单词。
我想知道我是否在正确的轨道上?我已经玩了一个多小时,似乎无法弄清楚在这之后我应该做什么。我是从正确的角度接近这个吗?
您想使用按长度 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());
最简单的方法是编写一个Comparator<String>
. 将Comparator<String>
接收两个单词,并对它们进行比较。如果第一个比第二个短,则应返回 -1。如果第二个比第一个短,则返回 1。如果它们的长度相同,则应调用默认String
compareTo
方法。然后,您可以使用此自定义对列表进行简单排序Comparator
。