4

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

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 可以跟踪所有单词的长度而没有任何重复,然后对其进行排序。

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

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

4

6 回答 6

5

您想使用按长度 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());

于 2013-09-19T03:23:23.270 回答
4

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

于 2013-09-19T03:21:32.740 回答
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);
    }
}
于 2013-09-19T03:32:31.640 回答
1

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

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

Map<Integer,List<String>>

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

Collections.sort(yourMap.get(theLength))

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

于 2013-09-19T03:30:45.783 回答
0

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

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

-示例取自Joshua Bloch的Effective Java

于 2018-12-10T20:28:45.020 回答
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]
于 2022-02-26T12:29:50.247 回答