簡體   English   中英

Java - 查找字符串數組的最小值和最大值

[英]Java - Find Minimum and Maximum value of an array of Strings

我是 Java 編程的新手。 下面的源代碼是在一本書中找到的,當我嘗試執行該程序時,它顯示了一些不正確的數據。

public class Pair<T> {

    private T first;
    private T second;

    public Pair() {
        first = null;
        second = null;
    }

    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public T getSecond() {
        return second;
    }

    public void setFirst(T newValue) {
        first = newValue;
    }

    public void setSecond(T newValue) {
        second = newValue;
    }  
}

查找字符串數組的最小值和最大值的邏輯

public class ArrayAlg {

    public static Pair<String> minmax(String[] arr) {
        if (arr == null || arr.length == 0)
            return null;

        String min = arr[0];
        String max = arr[0];

        for (int i = 1; i < arr.length; i++) {
            if (min.compareTo(arr[i]) > 0)
                min = arr[i];
            if (max.compareTo(arr[i]) < 0)
                max = arr[i];
        }
        return new Pair<String>(min, max);

    }
}

public static void main(String[] args) {

        String[] words = { "Mary", "had", "a", "little", "lamb" };
        Pair<String> obj = ArrayAlg.minmax(words);
        System.out.println("Minvalue " + obj.getFirst());
        System.out.println("Maxvalue " + obj.getSecond());

    }

如果你執行上面的程序,它會顯示Minvalue = Mary and MaxValue = little String 數組中的值a是最小值,但在這種情況下,它顯示Mary作為最小值。
誰能告訴我在 String 數組中找到最小值和最大值的更好方法嗎?

您得到的輸出是正確的輸出,因為字符串的自然排序是字典序,其中大寫字母在小寫字母之前。 因此Mary是“最小的”字符串。

為了不使用自然排序,不要使用StringcompareTo方法。 相反,您可以實施您認為合適的任何邏輯來確定哪個 String 更小。 引入替代排序的一種方法是將Comparator<String>實例傳遞給minmax方法並使用其compare方法比較String s。

我認為,出於您的目的,最好使用String方法compareToIgnoreCase()

但這取決於您了解Minimum stringMaximum string是什么。

此外,還有一種比較任何對象的首選方法 - 通過Comparator

public static Pair<String> minmax(String[] arr) {
    if (arr == null || arr.length == 0)
        return null;

    Arrays.sort(arr, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareToIgnoreCase(o2); // to compare by lexicographical order
            //return o1.length() - o2.lenth(); // to compare by length
        }
    });

    return new Pair<String>(arr[0], arr[arr.length - 1]);
}

以下是一些鏈接:

為此,您需要使用Comparator器。 您可以使用String.CASE_INSENSITIVE_ORDER Comparator按字母順序對單詞進行排序,忽略大小寫。

在 Java 8 中,這可以使用 Lambdas 輕松實現:

public final Pair<String> miniMax(final String[] words) {
    final String min = Arrays.stream(words).min(String.CASE_INSENSITIVE_ORDER).orElse(null);
    final String max = Arrays.stream(words).max(String.CASE_INSENSITIVE_ORDER).orElse(null);
    return new Pair<>(min, max);
}

測試:

String[] words = { "Mary", "had", "a", "little", "lamb" };
System.out.println(miniMax(words));

輸出:

a, Mary

compareTo()按字典順序比較字符串,這意味着大寫字母在小寫字母之前,因為這是Unicode 中的順序。 相反,請執行以下操作之一:

或者,對於一個好的 Java 8 實現,請參閱arizzle 的回答

所以,你的循環可能是:

for (int i = 1; i < arr.length; i++) {
    if (min.compareToIgnoreCase(arr[i]) > 0)
        min = arr[i];
    if (max.compareToIgnoreCase(arr[i]) < 0)
        max = arr[i];
}

或者:

Comparator<String> comp = Collator.getInstance();
for (int i = 1; i < arr.length; i++) {
    if (comp.compare(min, arr[i]) > 0)
        min = arr[i];
    if (comp.compare(max, arr[i]) < 0)
        max = arr[i];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM