[英]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
是“最小的”字符串。
為了不使用自然排序,不要使用String
的compareTo
方法。 相反,您可以實施您認為合適的任何邏輯來確定哪個 String 更小。 引入替代排序的一種方法是將Comparator<String>
實例傳遞給minmax
方法並使用其compare
方法比較String
s。
我認為,出於您的目的,最好使用String
方法compareToIgnoreCase()
。
但這取決於您了解Minimum string
和Maximum 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 中的順序。 相反,請執行以下操作之一:
使用不區分大小寫的Comparator
,可從String.CASE_INSENSITIVE_ORDER
輕松獲得
使用完整的特定於語言的Comparator
,它將排序特殊字符和國際字母,就像您在書籍索引中看到的那樣,可從Collator.getInstance()
或者,對於一個好的 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.