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

我被告知有一个按长度排序的单词列表,而那些长度相同的单词按字母顺序排序。 这就是我迄今为止所做的那种方法。

public static void doIt(BufferedReader r, PrintWriter w) throws IOException { TreeMap s = new TreeMap(); ArrayList count = new ArrayList(); 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个字母的所有单词。

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

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

你想使用一个比较长度为1的字符串比较器。 像这样:

 public class LengthFirstComparator implements Comparator { @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());来简单地对你的字符串进行排序Collections.sort(yourStringList, new LengthFirstComparator());

你可以使用简单的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 list=new ArrayList<>(); list.add("cowa"); list.add("cow"); list.add("aow"); Collections.sort(list, new Comparator() { @Override public int compare(String o1, String o2) { if(o1.length()>o2.length()){ return 1; }else{ return o1.compareTo(o2); } } }); System.out.println(list); } } 

到目前为止,最简单和最好的方法是编写自定义比较器,如其他答案所说。

但要做到这一点,你尝试的方法类似于将长度作为密钥,而不是单个字符串,因为该值具有该长度的所有单词的列表。 所以表格的地图

 Map> 

然后,您可以调用任意长度的键并返回这样的单词的排序列表

 Collections.sort(yourMap.get(theLength)) 

但比使用比较器要复杂得多