0

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

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!");
            }
        }
    }
}
4

3 回答 3

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);
}
于 2013-09-15T00:27:56.473 回答
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);
}
于 2013-09-15T00:28:29.797 回答
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
于 2013-09-15T01:08:33.820 回答