java – 如何正确初始化Comparator?

我需要在类MinTester中编写一个静态方法来计算“最小”字符串
使用比较器对象从ArrayList集合:

public static String min(ArrayList<String> list, Comparator<String> comp)

我不能使用Collections类来计算最小值.

这是我到目前为止所拥有的.

public class MinTester 
{
    public static String min(ArrayList<String> list, Comparator<String> comp)
    {
        String shortest = list.get(0);

        for(String str : list) {
            if ( comp.compare(str, shortest) < 0) {
                shortest = str;
            }
        }
        return shortest;
    }
}

我没有从这个方法中得到任何错误,所以我尝试用Main测试它.
尝试传递comp时出现此错误:变量comp可能尚未初始化

public static void main(String[] args)
{
    // TODO code application logic here

    MinTester s = new MinTester();
    Comparator<String> comp;
    ArrayList<String> list = new ArrayList<>();

    list.add("a");
    list.add("ab");
    list.add("abc");
    list.add("abcd");

    String a = s.min(list,comp);//Error: Variable comp may not have been initialized

    System.out.println(a);
}

这是我遇到问题的地方.

我试试

Comparator<String> comp = new Comparator<>();//Error:Comparator is abstract, cannot be instantiated
Comparator<String> comp = new MinTester();//Error: MinTester cannot be converted to Comparator<String>

谁能告诉我处理这个比较器的正确方法?我不确定我是否只是试图错误地初始化它,或者我在MinTester类中缺少某些东西.

解决方法:

您应该编写一个实现Comparator< String>的类.为了这.使用anonymous class的快速方法:

String a = s.min(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
});

由于您需要根据String长度进行比较,只需更改compare方法中的比较逻辑:

String a = s.min(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return (s1.length() > s2.length()) ? 1 : (s1.length() < s2.length()) ? -1 : 0;
    }
});

如果您碰巧使用Java 7,那么使用Integer#compare:

String a = s.min(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
});

如果使用Java 8,则可以使用lambda表达式:

String a = s.min(list, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
上一篇:c – 根据输入值对std :: map进行排序


下一篇:java – 为什么sort取一个Object数组?