2009-12-08 150 views
5

在Java中,如何將字符串數組轉換爲唯一值數組?如何將字符串數組轉換爲唯一值數組?

如果我有這樣的字符串數組:

String[] test = {"1","1","1","2"} 

而且我想直到結束:

String[] uq = {"1","2"} 
+0

使用修改後的Mergesort,刪除重複項w母雞遇到,而不是將兩個副本添加回列表。運行於**'O(N * logN)'** – 2013-10-06 18:45:01

回答

2

如果你與HashSet -approach去(這似乎非常方便),你應該使用的LinkedHashSet而不是HashSet,如果你想保持陣列的訂單!

Set<String> temp = new LinkedHashSet<String>(Arrays.asList(array)); 
String[] result = temp.toArray(new String[temp.size()]); 
1

一個簡單的方法是創建一個組,在陣列中添加的每個元素它,然後將該集合轉換爲數組。

1
List list = Arrays.asList(test); 
Set set = new HashSet(list); 

String[] uq = set.toArray(); 
+0

調用'Set.toArray()'會更容易。 – 2009-12-08 01:21:34

+0

是的,我選擇loooong的方式不知道爲什麼 – 2009-12-08 01:22:55

13

快速但有些低效的方式將是:

Set<String> temp = new HashSet<String>(Arrays.asList(test)); 
String[] uq = temp.toArray(new String[temp.size()]); 
+0

爲什麼它效率低下?考慮到該陣列可能有四個以上的值。另一種方法是對數組進行排序並查找模糊,對不對? – 2009-12-08 01:28:44

2
String[] test = {"1","1","1","2"}; 
java.util.Set result = new java.util.HashSet(java.util.Arrays.asList(test)); 
System.out.println(result); 
+0

「」+部分不是必需的,System.out.println(結果)是所有需要的。 – daveb 2009-12-08 01:47:35

+0

對,很着急:) – maximdim 2009-12-08 18:05:28

2

到HashSet的方法的一個替代方案是:

  1. 排序輸入數組

  2. 計算數字o所述排序後的數組

  3. f中不重複的值分配輸出數組

  4. 迭代排序陣列上,複製非重複值到它。

的HashSet的方法是O(N)平均假設1)你預先分配與右大小HashSet中和在輸入數組散列2)(非重複)值大致均勻。 (但是如果哈希值是病態的,最壞的情況是O(N**2)!)

平均分類方法是O(NlogN)

HashSet方法平均需要更多內存。

如果您很少這樣做對於非常大的「良好行爲」的輸入數組,HashSet方法可能會更好。否則,這可能是一種折騰,哪種方法更好。

2

我試着在這個頁面上的所有答案,沒有工作原樣。所以,這裏是我如何解決它,很多答案來自靈感Taigakuhn

import groovy.io.*; 
def arr = ["5", "5", "7", "6", "7", "8", "0"] 
List<String> uniqueList = new ArrayList<String>( 
     new LinkedHashSet<String>(arr.asList()).sort()); 
System.out.println(uniqueList) 
0

這裏是我的解決方案:

int[] A = {2, 1, 2, 0, 1}; 

Arrays.sort(A); 

ArrayList<Integer> B = new ArrayList<Integer>(); 

for (int i = 0; i < A.length; i++) { 
if (i == A.length-1) { 
    B.add(A[i]); 
} 
else if (A[i] != A[i+1]) { 
    B.add(A[i]); 
} 
} 
0
String[] getDistinctElementsArray(String[] arr){ 

    StringBuilder distStrings = new StringBuilder(); 
    distStrings.append(arr[0] + " "); 
    for(int i=1;i<arr.length;i++){ 
     if(arr[i].equals(arr[i-1])){} 
     else{ 
      distStrings.append(arr[i] + " "); 
     } 
    } 
    return distStrings.toString().split(" "); 
} 
0

剛剛發現一個更好的方式Java 8:

Arrays.stream(aList).distinct().toArray(String[]::new)