2013-05-14 62 views
0

Iv創建了一個數組,現在我必須從數組中刪除重複項並將重複項寫入一個txt文件,並將這些隨機數按順序越高越低,但如果有人可以至少告訴我如何從數組中獲取這些重複的整數,並將重複項放入已經完美的變量中。這是我的代碼。謝謝!沒有數組列表plz。刪除數組中的重複項並寫入文本文件

import java.util.Random; 
import java.io.*; 
import java.lang.*; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Arrays; 
import java.util.Scanner; 
public class MainProg extends GenKeys { 

    public static void main(String[] args) { 
     //int x = random(); 
     try { 

      BufferedWriter out = new BufferedWriter(new FileWriter("file.txt")); 


      for (int z = 0; z < 500; z++) { 
       int x = random(); 
       out.write(x + System.getProperty("line.separator")); 
      } 
      out.close(); 

      readFromfile(); 
     } catch (IOException e) { 
      System.out.print(e); 
     } 
    } 

    public static void readFromfile() throws IOException { 
     int[] numbers = new int[500]; 
     int result, searchValue; 

     int index = 0; 

     // Open the file. 
     File file = new File("file.txt"); 
     Scanner inputFile = new Scanner(file); 
     int w = 0; 
     for (int i = 0; i < numbers.length; i++) { 
      if (i == 0 || numbers[i] != numbers[i - 1]) { 
       numbers[w++] = numbers[i]; 

       while (inputFile.hasNextInt() && index < numbers.length) { 

        numbers[index] = inputFile.nextInt(); 
        System.out.println(numbers[index]); 
        index++; 
       } 
      } 
     } 

     // Close the file. 
     inputFile.close(); 
    } 
} 

GenKeys方法

import java.util.Random; 

public class GenKeys { 

static int x; 


public static int random(){ 
for (int i = 0; i < 250; i++) { 

x = (int) (Math.random() * 250); 

} 

return x; 




} 
} 
+0

你是如何產生隨機數的?我的意思是這個'int x = random();'你能告訴我們那個方法嗎? – Smit

回答

2

代替在陣列中存儲的整數它們存儲在內部。

更換int[] numbers = new int[500];

Set<Integer> numbers = new HashSet<Integer>();

,並取代所有呼籲numbers與可用於Set方法的方法。

+0

有沒有其他方式,我不需要使用數組列表? –

+0

還有很多其他方法不需要Set,但它們都不是乾淨/高效的。如果你有一些要求你不使用Set,那麼你應該在你的問題中指定這個要求。 –

+0

@UncleIroh'沒有數組列表plz.' OP確實說過。 – Smit

0

好的,首先你有一些奇怪的代碼,雖然它可能工作,但它仍然很奇怪。因此,我們首先清理您的循環代碼:

首先您有太多的計數變量。我看到index,w和i。你不需要那麼多。其次,如果我們看一下這兩條線的你的代碼:

if (i == 0 || numbers[i] != numbers[i - 1]) { 
       numbers[w++] = numbers[i]; 

然後,我們必須問自己什麼是if語句的第一部分的目的是什麼?如果i == 0那麼這隻會是第一次通過,所以w也將是0.那麼我們到達的內在部分,如果你設置numbers[0] = numbers[0]不需要,所以我們可以刪除你的i == 0部分如果發言,因爲它沒有得到什麼。然後繼續,進入while循環並通過所有輸入文件並將所有隨機數添加到您的數組數組中。然後你回到for循環,i現在是1,但你永遠不會再次通過while循環,因爲索引太大,相反,你對wiinumbers做了一些奇怪的事情,它似乎我認爲你設置了numbers[1] = numbers[1], numbers[2] = numbers[2]等,除非你碰巧得到兩個相同的連續的隨機數字,在這種情況下,你開始做numbers[3] = numbers[4]等。這一切都很奇怪,我肯定是不正確的。

所以,你可能希望得到的東西有點更像是:

index = 0; 
while (inputFile.hasNextInt() && index < numbers.length) { 
    numbers[index] = inputFile.nextInt(); 
    System.out.println(numbers[index]); 
    index++; 
} 

將填充您的數字陣列只有唯一的編號。 然後按照順序進行訂購。

Arrays.sort(numbers); 

然後檢查並刪除重複項。

for (int i = 0, j = 0; i < numbers.length; i = j > i ? j : i + 1) { 
    boolean duplicate = false; 
    j = i; 
    do { 
     if (j + 1 >= numbers.length) { 
      break; 
     } 
     duplicate = false; 
     if (numbers[i] == numbers[j + 1]) { 
      numbers[j + 1] = -1; // setting it to negative 1 so we know it's "removed" 
      duplicate = true; 
      j++; 
     } 
    } while (duplicate); 
} 

現在,您可以創建一個新的數組,並通過填充僅正值讀...或者只是使用現有的陣列打印出剩餘的號碼。