我需要在MinTester类中编写一个静态方法,该类使用比较器对象计算ArrayList集合中的“最小”字符串:
public static String min(ArrayList<String> list, Comparator<String> comp)
我不能使用Collections类来计算最小值。
这是我到目前为止所拥有的。
public class MinTester
{
static String least;//This is static because it is being used in a static static context
public static String min(ArrayList<String> list, Comparator<String> comp)
{
int min = 0;
for( int i = 0; i < list.size(); i++ )
{
min = list.get(i).compareTo(list.get(i++));
if(min < 0)
{
least = list.get(i);
}
else if(min == 0)
{
least = list.get(i);
}
else
{
least = list.get(i++);
}
}
return least;
}
}
我正在使用min值,因为我读到compareTo方法返回negative,0或positive,无论第一个字符串是小于,等于还是大于第二个字符串。
我没有从这个方法中得到任何错误,所以我尝试用Main测试它。我收到这个警告:“访问静态方法min”
public static void main(String[] args)
{
// TODO code application logic here
MinTester s = new MinTester();
Comparator<String> comp = null;
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("ab");
list.add("abc");
list.add("abcd");
String a = s.min(list,comp);//Warning: Accessing static method min
System.out.println(a);
}
我的输出来自a =“abcd”。任何人都可以帮我弄清楚为什么我将“abcd”作为列表中的“Min”字符串?我在想我的错误来自我的min()方法,但我不知道里面的内容或原因。
如果您需要在String
中找到最短的ArrayList
而不进行排序,您可以简单地遍历列表并检查每个.length
的String
属性,始终跟踪最短的String shortest = list.get(0);
for(String str : list) {
if (str.length() < shortest.length()) {
shortest = str;
}
}
System.out.println("The shortest string: " + shortest);
。
Comparator
编辑:
如果要实现两个字符串的自定义比较,可以使用Comparator
。比较它们的长度可以在1行中完成,所以Comparator
实际上没有必要。如果你绝对需要使用if (str.length() < shortest.length())
,你会替换
if (comp.compare(str, shortest) < 0))
通过
Comparator
它基本上是相同的,除了你没有自己定义比较,但留下String
来决定,哪两个Comparator
更小。这样,如果你想要将来比较字符串的方式,你就不必重写方法,你只需要提供不同的Comparator<String> comparator = (str1, str2) -> str1.length() > str2.length() ? 1 : -1;
String smallest = Arrays.stream(input)
.sorted(comparator).findFirst().get();
。
您可以使用length方法获取字符串元素的长度
Comparator
这应该返回字符串的大小
祝好运
一些指针,使用Comparator
,来获得想法。我不会解决整个问题,因为这显然是你的功课(为String
长度实现Comparator#compareTo(T, T)
,了解Comparator
返回的内容,阅读public static String min(List<String> list, Comparator<String> comp) {
String shortest = null;
for (String current : list) {
if (shortest == null) { // first iteration
shortest = current;
continue;
}
int comparisonResult = comp.compare(shortest, current);
// TODO: your task; update shortest, depending on comparisonResult
}
return shortest;
}
API):
object MinTest{
def main(args: Array[String]){
val list: util.List[String] = List("a", "ab", "abc", "abcd")
val m: String = min(list, (s1, s2) => s1.length - s2.length)
println(m) //output is: a
}
def min(list: util.List[String], comp: (String, String) => Int): String = {
if(list.isEmpty)
return null
var min = list(0)
for(i <- 0 until list.size if comp(list(i), min) < 0)
min = list(i)
min
}
}
不想为你做所有的工作,所以我将在Scala中提供一个解决方案:
qazxswpoi
虽然这是一种不同的语言,但逻辑仍然存在。将它转换为Java只是你的责任。
这很简单,你不能只是从列表中创建一个hashmap,其中hashmap中的数字是字符串的长度,然后hashmap中的值是与该值一起使用的字符串...
按键排序,选择项目零,然后你拥有它,对吧?
我所说的是将所有字符串放在列表中......对于该列表中的每个循环,同时注意一列中的字符串和另一列中该字符串的长度“当你在那里时”,排序依据长度,然后选择与该长度一致的第一个字符串。