如何将字符串数组转换为唯一值数组?

时间:2009-12-08 01:16:26

标签: java arrays

在Java中,如何将字符串数组转换为唯一值数组?

如果我有这个字符串数组:

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

我想最终:

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

10 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:3)

如果您使用HashSet - 方法(这看起来非常方便),如果您想维护数组的顺序,则应使用LinkedHashSet而不是HashSet!< / p>

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

HashSet方法的替代方法是:

  1. 对输入数组进行排序

  2. 计算已排序数组中非重复值的数量

  3. 分配输出数组

  4. 迭代已排序的数组,将非重复值复制到它。

  5. HashSet方法平均为O(N),假设1)您使用正确的大小预先分配HashSet,并且2)输入数组哈希中的(非重复)值大致均匀。 (但如果值散列是病态的,最坏的情况是O(N**2)!)

    排序方法平均为O(NlogN)

    HashSet方法平均占用更多内存。

    如果您对非常大的“表现良好”的输入数组不经常执行 OR ,则HashSet方法可能更好。否则,这可能是一种折腾,哪种方法更好。

答案 4 :(得分:2)

我在这个页面上尝试了所有的答案,但没有一个按原样运作。所以,这是我如何解决它,受到 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 )

答案 5 :(得分:1)

一种简单的方法是创建一个集合,将数组中的每个元素添加到它中,然后将该集合转换为数组。

答案 6 :(得分:1)

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

String[] uq = set.toArray();

答案 7 :(得分:1)

刚刚在Java 8中找到了一个更好的方法:

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

答案 8 :(得分: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]);
 }
}

答案 9 :(得分: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(" ");
}