2017-08-06 57 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);