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

时间:2013-09-19 03:17:34

标签: 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);
}

我的心态是使用TreeMap来保持String,并将单词的长度作为键。我还有一个ArrayList,它可以跟踪所有单词的长度而不需要重复,然后排序。

我希望以某种方式在TreeMap上调用键值5,这将列出其中包含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 的示例