简体   繁体   中英

How do I convert an array of strings to a array of unique values?

In Java, how do I convert an array of strings to a array of unique values?

If I have this array of Strings:

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

And I want to end up with:

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

Quick but somewhat inefficient way would be:

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

If you're going with the HashSet -approach (which seems pretty handy) you should use a LinkedHashSet instead of a HashSet if you want to maintain the array's order!

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

I tried all the answers on this page and none worked as-is. So, here is how I solved it, inspired by the answers from Taig and 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 )
String[] test = {"1","1","1","2"};
java.util.Set result = new java.util.HashSet(java.util.Arrays.asList(test));
System.out.println(result);

An alternative to the HashSet approach would be to:

  1. Sort the input array

  2. Count the number of non-duplicate values in the sorted array

  3. Allocate the output array

  4. Iterate over the sorted array, copying the non-duplicate values to it.

The HashSet approach is O(N) on average assuming that 1) you preallocate the HashSet with the right size and 2) the (non-duplicate) values in the input array hash roughly evenly. (But if the value hashing is pathological, the worst case is O(N**2) !)

The sorting approach is O(NlogN) on average.

The HashSet approach takes more memory on average.

If you are doing this infrequently OR for really large "well behaved" input arrays, the HashSet approach is probably better. Otherwise, it could be a toss-up which approach is better.

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

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

String[] uq = set.toArray();

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

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

here is my solution:

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]);
 }
}
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(" ");
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM