繁体   English   中英

比较数组中的字符串元素

[英]Compare String elements in an Array

我正在尝试比较数组中的元素。 例如,

labels = ["abc1","abc2","abc3","abc4"]

我想采用具有最高值的字符串。 在这种情况下,它的 abc4。 我对编码很陌生,所以如果有人可以帮助我理解逻辑,那就太好了。

您正在寻找的是一种将每个字符串相互比较的方法。

Java 有一个内置的方法来为String class 执行此操作,称为compareTo方法。 顾名思义,它将一个字符串与另一个字符串进行比较。

String a = "abc1";
String b = "abc2";
String c = "abc1";
System.out.println(a.compareTo(b)); // prints a negative number because `a` is smaller than `b`
System.out.println(b.compareTo(a)); // prints a positive number because `b` is bigger than `a`
System.out.println(c.compareTo(a)); // prints 0 because `a` and `b` have the same letters.

有关compareTo方法,请参阅官方 java 文档

[返回]如果参数字符串等于该字符串,则值为 0; 如果此字符串按字典顺序小于字符串参数,则值小于 0; 如果此字符串按字典顺序大于字符串参数,则值大于 0。

您可以在示例中使用它的方式是:

String biggest = labels[0];
for(int i = 1; i < labels.length; i++){
  if(biggest.compareTo(labels[i]) < 0) biggest = labels[i];
}
System.out.println(biggest);

注意:有关此方法如何选择“更大”的更多详细信息,请参阅 java 文档(上面链接)。 如果您有自己的规则来决定哪个更大,那么您可以制定自己的方法来定义它。

更新:例如,请参阅 XtremeBaumer 的评论

"abc20".compareTo("abc100") = 1。表示 abc20 大于 abc100,因此 compareTo() 不一定对任务有用

您的问题需要改进,根据您所说的,让我们从字符串中删除所有 abc,获取最大 integer,然后返回或打印"abc" concatenated to the max number

import java.util.Arrays;
import java.util.stream.IntStream;

public class Solution {

    public static void main(String[] args) throws Throwable {
        int numberOfElements = 100;
        String[] labels = new String[numberOfElements];

        Arrays.setAll(labels, element -> "abc" + element);

        int max = Arrays.stream(labels).mapToInt(element -> Integer.parseInt(element.substring(3))).max().getAsInt();

        System.out.println(String.join(" | ", labels));

        System.out.println();
        System.out.println();
        System.out.println("The max here is : ");
        System.out.println("abc" + max);
    }
}

Output 这里:

abc0  |  | abc1  |  | abc2  |  | abc3  |  | abc4   ...... || abc99
    
The max here is : 
    abc99

尝试这样的事情:

    var strings = new ArrayList<String>();
    strings.add("abc1");
    strings.add("abc2");
    strings.add("abc3");
    strings.add("abc4");


    var integers = strings
            .stream()
            .map(string -> Integer.valueOf(string.replaceAll("[^0-9]+", "")))
            .collect(Collectors.toList());
    var max = Collections.max(integers);
    var indexMax = integers.indexOf(max);
    var maxString = strings.get(indexMax);
    System.out.println(maxString);

更简单的方法: @mcieciel已经发布了这个。

List<String> list = Arrays.asList("abc1", "abc22", "abc33", "abc19");
List<Integer> intList = list.stream()
                            .map(s -> Integer.parseInt(s.replaceAll("[^0-9]+", "")))
                            .collect(Collectors.toList());
int index = intList.indexOf(Collections.max(intList));
System.out.println(list.get(index));

另一种方法是创建一个map ,它将在键值对中包含字符串及其对应的 integer 值。然后从 map 中找到带有其键的最大值。
这可能是矫枉过正。

String key = list.stream()
                .collect(Collectors.toMap( // creating map like this format : abc1->1 , abc22->22 ...
                        Function.identity(), // key of the map i.e the string value
                        s -> Integer.parseInt(s.replaceAll("[^0-9]+", "")), // integer value
                        (e1, e2) -> e1)) // if multiple same entry exists choose one
                .entrySet() // now we have map, we can iterate and find out the key which holds max value
                .stream()
                .max((e1, e2) -> Integer.compare(e1.getValue(), e2.getValue())) // comparing values
                .get()
                .getKey();

System.out.println(key);

注意:如果您有没有任何数字的字符串值,则两者都不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM