我被告知有一个按长度排序的单词列表,而那些长度相同的单词按字母顺序排序。这就是我迄今为止所做的方法。
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);
}
我的心态是使用TreeMap来保持String,并将单词的长度作为键。我还有一个ArrayList,它可以跟踪所有单词的长度而不需要重复,然后排序。
我希望以某种方式在TreeMap上调用键值5,这将列出其中包含5个字母的所有单词。
我想知道我是否走在正确的轨道上?我已经玩了一个多小时了,似乎无法弄明白我应该做些什么。我是从正确的角度接近这个吗?
答案 0 :(得分:4)
最简单的方法是编写Comparator<String>
。 Comparator<String>
会收到两个单词,并进行比较。如果第一个比第二个短,则应返回-1。如果第二个比第一个短,则返回1.如果长度相同,则应调用默认的String
compareTo
方法。然后,您只需使用此自定义Comparator
对列表进行排序。
答案 1 :(得分:4)
你想使用一个比较长度为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);
}
}
然后你可以通过调用Collections.sort(yourStringList, new LengthFirstComparator());
答案 2 :(得分:3)
你可以使用简单的List来做到这一点。请尝试以下代码。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
*
* @author Masudul Haque
*/
public class LengthSort {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("cowa");
list.add("cow");
list.add("aow");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length()>o2.length()){
return 1;
}else{
return o1.compareTo(o2);
}
}
});
System.out.println(list);
}
}
答案 3 :(得分:1)
到目前为止,最简单和最好的方法是编写自定义比较器,如其他答案所说。
但要做到这一点,你尝试的方法是将长度作为密钥而不是单个字符串,因为该值具有该长度的所有单词的列表。所以形式的地图
Map<Integer,List<String>>
然后你可以调用任意长度的键并返回一个像这样的单词的排序列表
Collections.sort(yourMap.get(theLength))
但是比使用比较器更复杂
答案 4 :(得分:0)
您可以使用Java 8的lamba实用程序来制作简洁的函数,从而避免使用比较器类的混乱,例如:
Collections.sort(words, (string1, string2) -> Integer.compare(string1.length(), string2.length());
-摘自Joshua Bloch的 Effective Java 的示例