Java: 按长度和字母顺序对单词列表进行排序

5

我被要求按长度排序单词列表,对于那些具有相同长度的单词,按字母顺序排序。以下是目前用于实现该功能的方法。

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来存储字符串,以单词长度作为键。我还有一个ArrayList用于跟踪所有单词的长度,没有重复项,并进行排序。
我希望能够以5为键值调用TreeMap,这将列出所有长度为5个字母的单词。
我在想我是否走在正确的道路上?我已经试验了一个多小时,似乎无法找到下一步该怎么做。我是否从正确的角度来考虑这个问题?

4
可以编写自定义比较器来完成此操作。http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html - Kon
6个回答

5
您想使用一个字符串比较器,首先按长度进行比较。如下所示:

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

请注意,此方法将会按照字符串长度进行排序。

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

删除我的答案,因为它们说的是同样的事情。不错。不确定他是否需要TreeMap。只需将单词放入ArrayList并排序即可。1+ - Hovercraft Full Of Eels

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

1

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

但是,如果要以类似的方式进行操作,则可以将长度作为键,并且不是将单个字符串作为值,而是将该长度的所有单词列表化。因此,形式为:

Map<Integer,List<String>>

您可以调用任意长度的键,并返回类似于以下内容的单词排序列表。
Collections.sort(yourMap.get(theLength))

但远比仅使用比较器复杂。

0
如果你有这样一个句子 - 苹果和葡萄不是蔬菜,并且要按照长度排序,如果两个或多个单词相等,则按字母顺序排序,那么代码如下:
public class ExampleDemo {
    public static void main(String[] args) {
        String s = "Apple and grape are not vegetables";
        ExampleDemo e = new ExampleDemo();
        e.display(s);
    }

    public void display(String str) {
        String[] st = str.split(" ");
        List<String> list = new ArrayList<>();
        for(String word: st){
            list.add(word);
        }
        System.out.println("Before sorting: " + list);
        Comparator<String> comparator = (s1,s2) -> Integer.compare(s1.length(), s2.length());
        Collections.sort(list, comparator);
        System.out.println("After sorting: " + list);
    }
}

输出:

Before sorting: [Apple, and, grape, are, not, vegetables]
After sorting: [and, are, not, Apple, grape, vegetables]

0
你可以使用Java 8的lambda工具创建简洁的函数,避免使用比较器类带来的混乱,例如:
Collections.sort(words, (string1, string2) -> Integer.compare(string1.length(), string2.length());

-这个例子来自于 Joshua Bloch 的 Effective Java 一书。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接