如何使用Comparator计算ArrayList中的最小字符串?

问题描述 投票:0回答:6

我需要在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()方法,但我不知道里面的内容或原因。

java string arraylist comparator
6个回答
2
投票

如果您需要在String中找到最短的ArrayList而不进行排序,您可以简单地遍历列表并检查每个.lengthString属性,始终跟踪最短的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();


1
投票

使用Streams和Comparator-

Find Shortest Length String

参考:e.g. list.get(0).length()


0
投票

您可以使用length方法获取字符串元素的长度

Comparator

这应该返回字符串的大小

祝好运


0
投票

一些指针,使用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
  }
}

0
投票

不想为你做所有的工作,所以我将在Scala中提供一个解决方案:

qazxswpoi

虽然这是一种不同的语言,但逻辑仍然存在。将它转换为Java只是你的责任。


0
投票

这很简单,你不能只是从列表中创建一个hashmap,其中hashmap中的数字是字符串的长度,然后hashmap中的值是与该值一起使用的字符串...

按键排序,选择项目零,然后你拥有它,对吧?

我所说的是将所有字符串放在列表中......对于该列表中的每个循环,同时注意一列中的字符串和另一列中该字符串的长度“当你在那里时”,排序依据长度,然后选择与该长度一致的第一个字符串。

© www.soinside.com 2019 - 2024. All rights reserved.