簡體   English   中英

在數組中打印不同的整數

[英]Printing distinct integers in an array

我正在嘗試編寫一個小程序來打印出數組中的不同數字。 例如,如果用戶輸入 1,1,3,5,7,4,3,程序將只打印出 1,3,5,7,4。

我在 function 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;
}
}

最簡單的方法是將所有元素添加到Set<Integer> ,然后只打印Set的內容。

首先,“ else if ”語句是不正確的,因為你沒有為 if 提供任何條件(如果你想要一個 if,你需要寫“ if (condition)... ”)。

其次,您無法在內部循環內部決定是否應該打印一個值:您的代碼的工作方式是為每個不同於 array[i] 的值 array[j]編寫一個值 array[i]!

第三:內部循環只需要 go 從 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]);
  }
}

但是當然,對於更大的 arrays 來說,某種Set會更有效......


編輯:當然, mmyers (見評論)說得對,因為CheckDuplicate()不返回任何值,它應該有返回類型void (而不是int )。 我在上面的代碼中更正了這個......

將它們放入按插入時間排序的集合中,然后在必要時轉換回數組。

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

嘗試將所有整數放入一個集合中。 重復項永遠不會添加到集合中,您將留下一組唯一整數。

您可以使用 Java 集合 API 來完成您想要的工作,但不完全是單線,因為事實收集方法適用於Object s 而不是原語。 J2SE 缺少將int[]轉換為Integer[]的方法,但 Apache Commons Lang包含此類有用的方法,例如ArrayUtils.toObject()ArrayUtils.toPrimitive()

使用它們,從 integer 數組中刪除重復元素的方法如下所示:

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()]));
}

如果您的應用程序可能包含更多的數組/集合操作,我建議您查看該庫,而不是從頭開始實現。 但是,如果您是出於學習目的而這樣做,請遠離編碼!

將每個數字添加到Set實現而不是數組可能會更好。 集合專門用於存儲要過濾掉重復項的元素的 collections。

要么按照其他人的建議使用 Set,要么使用與 List 兼容的 class。 使用列表兼容的 class 只需使用 Contains 方法檢查它是否已存在於數組中。

導入 java.util.Scanner; 公共 class 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]);
        }
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM