2017-08-06 55 views
2

我想擴展當前的程序以接受任意數量的命令行參數並打印較小的一個(區分大小寫)。目前,它就像這樣:什麼我後我從多個命令行參數中打印較少的字符串

public class StringCompare { 

    public static void main(String[] args) { 

     String s1 = new String(args[0]); 
     String s2 = new String(args[1]); 

     if (s1.compareTo(s2) > 0) { 
      System.out.println(s2); 
     } 
     else if (s1.compareTo(s2) < 0) { 
      System.out.println(s1); 
     } 
     else { 
      System.out.println("Both are equal."); 
     }  
    } 
} 

例子:

Input: aaa aa a aAa 

Output: a 

什麼是優雅的方式來處理呢?

回答

3

使用Java 8語法和lambda表達式,你可以做到這一點如下:

編輯(基於由@青峯的意見建議)

public static void main(String[] args) { 

    String min = Arrays.stream(args) 
      .min(String::compareTo) 
      .orElse("<none>"); 

    System.out.println(min); 
} 


如果你想知道如果所有的字符串都相同,您可能需要添加額外的步驟來檢查它:

public static void main(String[] args) { 

    String min = Arrays.stream(args) 
      .min(String::compareTo) 
     .orElse("<none>"); 

    if (!Arrays.stream(args) 
      .allMatch(x-> x.equals(min))) { 
     System.out.println(min); 
    } else { 
     System.out.println("All are equal."); 
    } 
} 
+2

'Arrays.asList(args).stream()'是不必要的,當'args'包含很多元素時會導致開銷。所以,我會使用'Arrays.stream(args).min(String :: compareTo);'來代替。另外,你沒有正確使用'Optional'。我建議在'get'調用之前使用'IfPresent',或者改爲像'string smallestElement = Arrays.stream(args).min(String :: compareTo).orElse(enterSomeDefaultValueOrNull);' –

1

使用for循環,和一個temp(較小)的字符串變量。

//validate args , not null, and length != 0 

if(args == null || args.length ==0){ 
    System.out.println("No strings to compare"); 
    return; 
} 
string lesser = args[0]; // assume 1st argument is the lesser. 
for(int a=0;a<args.length;a++){ 
    if (lesser.compareTo(args[a]) > 0) { 
     lesser = args[a];// the new lesser string 
    } 
    //we ignore other cases (args[a] is larger or equals, cuz we want lesser only 
} 

System.out.println("Lesser String is " + lesser);