在Java中,如何将字符串数组转换为唯一值数组?
如果我有这个字符串数组:
String[] test = {"1","1","1","2"}
我想最终得到:
String[] uq = {"1","2"}
如果你想使用HashSet
-approach(这看起来非常方便),你应该使用LinkedHashSet
而不是HashSet
,如果你想保持阵列的顺序!
Set<String> temp = new LinkedHashSet<String>( Arrays.asList( array ) );
String[] result = temp.toArray( new String[temp.size()] );
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(" ");
}
快速但有些低效的方式是:
Set<String> temp = new HashSet<String>(Arrays.asList(test));
String[] uq = temp.toArray(new String[temp.size()]);
HashSet方法的替代方案是:
HashSet方法平均为O(N)
,假设1)您使用正确的大小预先分配HashSet,并且2)输入数组中的(非重复)值大致均匀地散列。 (但如果值散列是病态的,最糟糕的情况是O(N**2)
!)
排序方法平均是O(NlogN)
。
HashSet方法平均占用更多内存。
如果您不经常这样做或者对于非常大的“表现良好”的输入数组,HashSet方法可能更好。否则,这可能是一种折腾,哪种方法更好。
String[] test = {"1","1","1","2"};
java.util.Set result = new java.util.HashSet(java.util.Arrays.asList(test));
System.out.println(result);
我在这个页面上尝试了所有答案,但没有一个按原样运行。所以,这是我如何解决它,灵感来自Taig和akuhn的答案:
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 )
一种简单的方法是创建一个集合,将数组中的每个元素添加到它,然后将集合转换为数组。
List list = Arrays.asList(test);
Set set = new HashSet(list);
String[] uq = set.toArray();
刚刚在Java 8中找到了一个更好的方法:
Arrays.stream(aList).distinct().toArray(String[]::new)
这是我的解决方案:
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]);
}
}