我需要在类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()));