2015-03-02 33 views
-2

我的問題是我怎麼會不允許重複值到數組中?例如,我有一個程序,應該採取10到100之間的五個用戶輸入值,並將它們放入一個數組中。此外,它應該告訴用戶當前正在輸入的值是否與當前在數組中找到的值相同。如果是這樣,它不應該記錄該值,並且在五個輸入的末尾,它應該只輸出具有唯一值的數組。例如,用戶輸入:12,16,30,30,99,最終輸出將是:12,16,30,99。我將如何消除重複項?如何不允許重複值到數組中?

+9

通過使用'Set'。 – 2015-03-02 22:26:09

+0

你有沒有考慮過HashTable?他們在這個確切的任務中非常快速和高效:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Hashtable.java – 2015-03-02 22:27:06

+0

我必須自己寫代碼,沒有什麼可以使用的。 – Person123 2015-03-02 22:28:23

回答

2

一個簡單的方法就是將每個輸入存儲到一個Set中,因爲如果它已經存在,它將不會添加數據。

一個不包含重複元素的集合。更正式地說,集合 不包含元素對e1和e2,使得e1.equals(e2)和 中的大多數爲null元素。正如其名稱所暗示的那樣,該接口模型 是數學集抽象。

請注意,add方法將返回true,如果該集合尚未包含指定的元素,如果它允許記錄錯誤消息更容易。

if(!yourSet.add(input)) 
    System.out.println("Already exist."); 

如果你看看HashSet

public boolean add(E e) { 
    return map.put(e, PRESENT)==null; 
} 

map方法的源代碼,你會發現,一切都存儲在HashMap,然後在每次添加,返回值將是,如果真put調用返回null,如果沒有此鍵的先前映射,將會發生這種情況。

PRESENT對象只是一個虛擬值,可以正確使用put方法。

// Dummy value to associate with an Object in the backing Map 
private static final Object PRESENT = new Object(); 

如果你真的不能使用Set,在這裏你怎麼能做到這一點:

  • 定義,這將是一個標誌標記,如果值是平等的或不是一個布爾值。
  • 每次輸入時,都會循環訪問數組的所有數據。
  • 在每次迭代中,只有在數據相等的情況下才將標誌設置爲true。
  • 確保您的循環停止循環時,布爾值被設置爲true

    for(int i = 0; !flag && i < array.length; i++) 
    
  • 外循環只有在標誌的值爲false添加數據。
  • 將所有這些放在另一個讀取所有用戶輸入的循環中,直到輸入一個sentinel value
+0

爲什麼downvote? – 2015-03-02 22:54:55

+0

因爲一個Set是適當的數據結構。請看我的回答 – hd1 2015-03-02 22:56:30

+0

@ hd1這是正確的..編輯。 – 2015-03-02 22:58:19

1

使用Set

Set<Integer> aSet = new HashSet<Integer>(); 
aSet.add(12); 
aSet.add(16); 
aSet.add(30); 
aSet.add(30); 
aSet.add(99); 
for (Integer number:aSet) { 
    System.err.print(number+", "); 
} 
System.err.println(); 

這將打印出12, 16, 30, 99,

+0

但我試圖不打印重複,輸出有兩個30秒。 – Person123 2015-03-02 23:53:05

+0

您可以在相信我胖胖的手指之前嘗試一下代碼嗎? – hd1 2015-03-03 00:05:28