如何让Java从命令行参数输出唯一的整数?

时间:2013-09-15 00:23:58

标签: java arrays unique

下面的代码检查以确保命令行参数是整数?但是,我需要它只打印一次命令行中的每个整数,无论​​整数出现在命令行中的次数。我怎么做?

public class Unique {
    public static void main(String[] args) {
        for (int i = 0; i<args.length; i++) {
            try {
                int j = Integer.parseInt(args[i]);
                System.out.println(j);
            }
            catch (NumberFormatException e) {
                System.out.println("Your command line argument "+ args[i] +" is a non-integer!");
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

你需要的是一套。集合不包含重复项,因为它是以数学方式定义的。 Java有一个Set类来完成这项工作。

Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < args.length; i++)
{
    try
    {
        int j = Integer.parseInt(args[i]);
        set.add(j);
    }
    catch (NumberFormatException e)
    {
        System.out.println("Your command line argument "+ args[i] +" is a non-integer!");
    }
}
System.out.println(set);

或迭代所有这些元素:

for (Integer i : set)
{
    System.out.println(i);
}

答案 1 :(得分:0)

public class Unique {

public static void main(String[] args) {

    final Set<Integer> uniqueIntegers = new HashSet<>();        

    for (int i = 0; i<args.length; i++) {
        try {
            int j = Integer.parseInt(args[i]);
            uniqueIntegers.add(j);
        }
        catch (NumberFormatException e) {
            System.out.println("Your command line argument "+ args[i] +" is a non-integer!");
        }
    }

    System.out.println(uniqueIntegers);
}

答案 2 :(得分:0)

public class UniqueNumbers {
  public static void main(String[] args) {
    args = new String[6];
    args[0] = "5";
    args[1] = "6";
    args[2] = "2";
    args[3] = "5";
    args[4] = "1";
    args[5] = "1";

    Arrays.sort(args); 
   // Sort the array. This will use natural order:
   // low -> high for integers, a -> z and low to high for strings
   // Essentially this causes our array to sort from low to high, despite not being integers

    for (int i = 0; i < args.length; i++) { // Loop over the entire array
        if (i == 0) { // (1)
            System.out.println(args[0]);
        } else if (!(args[i - 1].equals(args[i]))) { // (2)
            System.out.println(args[i]);
        }
    }
  }
}

输出:

1
2
5
6

澄清:

为了便于演示,我手动将值放入数组中。这没什么区别,您可以继续使用输入法。

(1):首先阅读(2)。由于下面的方法,我们基本上会跳过第一个元素。 else if的第二部分实质上是if i > 0。如果我们不这样做,我们会在ArrayIndexOutOfBoundsException时获得args[i - 1],因为这会尝试访问args[-1]。这就是我们跳过第一个元素的原因:避免这种情况。但是,这也意味着我们的第一个值(1)将被忽略。这就是为什么我们只想确保始终打印第一个值。

(2):现在我们检查当前元素(args[i])是否与前面的元素(.equals())相等(args[i -1])。如果不是这种情况(!反转一个语句),我们打印当前值。

使用此方法,您可以在不使用任何数据结构的情况下解决您的任务。

更多可视化:

开始:

5 6 2 5 1 1

类别:

1 1 2 5 5 6

循环:

!  
1 1 2 5 5 6 -> Output: 1

  !
1 1 2 5 5 6 -> Not different from previous one, no output

    !
1 1 2 5 5 6 -> Different from previous one, output: 1 2

      !
1 1 2 5 5 6 -> Different from previous one, output 1 2 5

        !
1 1 2 5 5 6 -> Not different from previous one, no output

          !
1 1 2 5 5 6 -> Different from previous one, output 1 2 5 6