【问题标题】:Printing distinct integers in an array在数组中打印不同的整数
【发布时间】:2010-10-15 01:09:20
【问题描述】:

我正在尝试编写一个在数组中打印出不同数字的小程序。例如,如果用户输入 1,1,3,5,7,4,3,程序只会打印出 1,3,5,7,4。

我在函数 checkDuplicate 的 else if 行中遇到错误。

到目前为止,这是我的代码:

import javax.swing.JOptionPane;

public static void main(String[] args) {
    int[] array = new int[10];
    for (int i=0; i<array.length;i++) {
        array[i] = Integer.parseInt(JOptionPane.showInputDialog("Please enter"
                                  + "an integer:"));
    }
    checkDuplicate (array);
}

public static int checkDuplicate(int array []) {
    for (int i = 0; i < array.length; i++) {
        boolean found = false;
        for (int j = 0; j < i; j++)
            if (array[i] == array[j]) {
                found = true;
                break;
            }
        if (!found)
            System.out.println(array[i]);
    }
    return 1;
}
}

【问题讨论】:

  • 我希望能够让用户输入 10 个数字。这些数字将被添加到一个数组中。然后它将打印出用户输入的所有数字,除了任何重复的数字。
  • @unknown:使用您更改的代码,不再有真正的问题。您已使最佳答案过时。您介意将问题回滚以供参考吗?如果您愿意,您仍然可以在末尾添加一个包含新改进代码的部分。

标签: java arrays duplicates


【解决方案1】:

最简单的方法是将所有元素添加到Set&lt;Integer&gt;,然后只打印Set 的内容。

【讨论】:

    【解决方案2】:

    首先,“else if”语句是不正确的,因为你没有为if提供任何条件(如果你想要一个if,你需要写“if (condition) ...”)。

    其次,你不能决定 在内部循环中是否应该打印一个值:你的代码的工作方式是你为每个值数组[j]编写一个值数组[i] 与数组[i] 不同!

    第三:内循环只需要从0到外索引i-1:对于每个元素,你只需要判断它是否是第一次出现(即相同的值是否出现在任何先前的索引或不是)。如果是,打印出来,如果不是,忽略它。

    CheckDuplicate() 的正确实现是:

    public static void checkDuplicate(int array []) {
      for (int i = 0; i < array.length; i++) {
        boolean found = false;
        for (int j = 0; j < i; j++)
          if (array[i] == array[j]) {
            found = true;
            break;
          }
        if (!found)
          System.out.println(array[i]);
      }
    }
    

    当然,某种Set 对于更大的数组会更有效...


    编辑:当然,mmyers(见 cmets)说得对,因为 CheckDuplicate() 不返回任何值,它应该有返回类型 void(而不是 @987654329 @)。我在上面的代码中更正了这个......

    【讨论】:

    • 天啊!我刚刚花了 15 分钟写了一个正确的答案,然后在我发布它之前,你几乎逐字逐句地复制了它!当然,现在我有义务给你 +1。
    • 哦,我提到了但你没有提到的一件事:方法中没有返回值。从问题陈述来看,我猜它应该返回 void。
    【解决方案3】:

    将它们放入按插入时间排序的集合中,然后在必要时转换回数组。

    new LinkedHashSet<Integer>(array).toArray()
    

    【讨论】:

      【解决方案4】:

      尝试将所有整数放入一个 Set 中。永远不会将重复项添加到集合中,您将得到一组唯一整数。

      【讨论】:

        【解决方案5】:

        您想要的可以使用 Java 集合 API 来完成,但不完全是单线,因为事实集合方法适用于 Objects 而不是原语。 J2SE 缺少将 int[] 转换为 Integer[] 的方法,但 Apache Commons Lang library 包含这些有用的方法,例如 ArrayUtils.toObject()ArrayUtils.toPrimitive()

        使用它们,从整数数组中删除重复元素的方法如下所示:

        public static int[] removeDuplicates(int... array) {
            Integer[] ints = ArrayUtils.toObject(array);
            Set<Integer> set = new LinkedHashSet<Integer>(Arrays.asList(ints));
            return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
        }
        

        如果您的应用程序可能包含更多的数组/集合操作,我建议您查看该库,而不是从头开始实现。但是,如果您是出于学习目的而编写代码,请远离!

        【讨论】:

          【解决方案6】:

          将每个数字添加到Set 实现而不是数组可能会更好。集合专门用于存储要过滤掉重复项的元素集合。

          【讨论】:

            【解决方案7】:

            使用其他人建议的 Set 或使用 List 兼容类。对于列表兼容类,只需使用 Contains 方法检查它是否已存在于数组中。

            【讨论】:

              【解决方案8】:

              导入 java.util.Scanner; 公共类 PrintDistinctNumbers {

              /**
               * @param args the command line arguments
               */
              public static void main(String[] args) {
                  int [] numberArray = createArray();
                  System.out.println("The number u entered are:   ");
                  displayArray(numberArray);
                  getDistinctNumbers(numberArray);
              }
              
              public static int[] createArray() {
                  Scanner input = new Scanner(System.in);
                  int [] numberCollection = new int [10];
                  System.out.println("Enter 10 numbers");
              
                  for(int i = 0; i < numberCollection.length; i++){
                      numberCollection[i] = input.nextInt();
                  }
                  return numberCollection;
              
              }
              
              public static void displayArray(int[] numberArray) {
                  for(int i = 0; i < numberArray.length; i++){
                      System.out.print(numberArray[i]+" ");
                  }
              }
              
              public static void getDistinctNumbers(int[] numberArray) {
                  boolean isDistinct = true;
                  int temp = 0;
                  int [] distinctArrayNumbers = new int [10];
                  for ( int i = 0; i < numberArray.length; i++){
                      isDistinct = true;
                          temp = numberArray[i];
              
                          for( int j = 0; j < distinctArrayNumbers.length; j++){
                              if( numberArray[i] == distinctArrayNumbers[j] ){
                              isDistinct = false;
                          }
              
              
                         }
                          if(isDistinct){
                                  distinctArrayNumbers[temp]=numberArray[i];
                                  temp++;
                              }
              
              
                  }
                  displayDistinctArray(distinctArrayNumbers);
              }
              
              public static void displayDistinctArray(int[] distinctArrayNumbers) {
                  for( int i = 0; i < distinctArrayNumbers.length; i++){
                      if(distinctArrayNumbers[i] != 0){
                      System.out.println(distinctArrayNumbers[i]);
                      }
                  }
              }
              

              }

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-02-09
                • 2022-11-25
                • 2012-05-14
                • 1970-01-01
                • 2021-09-29
                • 2014-04-22
                • 2013-06-02
                相关资源
                最近更新 更多