【问题标题】:Java: Sort a list of words by length, then by alphabetical orderJava:按长度排序单词列表,然后按字母顺序
【发布时间】:2013-09-24 00:07:33
【问题描述】:

我被告知有一个按长度排序的单词列表,并且具有相同长度的单词按字母顺序排序。到目前为止,这就是我所拥有的方法。

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,并以单词的长度作为 key。我还有一个 ArrayList 可以跟踪所有单词的长度而没有任何重复,然后对其进行排序。

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

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

【问题讨论】:

标签: java sorting map


【解决方案1】:

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

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】:

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

    【讨论】:

    • 删除我对你的回答,因为他们说的是同样的事情。好东西。不确定他是否需要 TreeMap。只需将单词放入 ArrayList 并排序就足够了。 1+
    【解决方案3】:

    您可以使用简单的列表来做到这一点。试试下面的代码。

    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);
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      但是要以类似的方式进行操作,您将尝试将长度设为键,而不是使用单个字符串作为值,该字符串包含该长度的所有单词的列表。所以一张表格的地图

      Map<Integer,List<String>>
      

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

      Collections.sort(yourMap.get(theLength))
      

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

      【讨论】:

        【解决方案5】:

        您可以使用 Java 8 的 Lamba 实用程序来制作简洁的函数,以防止使用比较器类造成混乱,如下所示:

        Collections.sort(words, (string1, string2) -> Integer.compare(string1.length(), string2.length());
        

        -示例取自 Joshua Bloch 的 Effective Java

        【讨论】:

          猜你喜欢
          • 2017-11-17
          • 1970-01-01
          • 1970-01-01
          • 2011-03-25
          • 1970-01-01
          • 2020-09-03
          • 1970-01-01
          • 2018-11-02
          相关资源
          最近更新 更多