Code Hungry
Code Hungry

Reputation: 4000

How to get unique values from array

I have an Array from which i want to remove Duplicate items.

for(int data1=startpos;data1<=lastrow;data1++) {
    String movie_soundtrk=cells.getCell(data1,Mmovie_sndtrk_cl).getValue().toString();
    al.add(movie_soundtrk);
}

String commaSeparated=al.toString();
String [] items = commaSeparated.split(",");
String[] trimmedArray = new String[items.length];
for (int i = 0; i < items.length; i++) {
    trimmedArray[i] = items[i].trim();
}

Set<String> set = new HashSet<String>();
Collections.addAll(set, trimmedArray);

System.out.println(set);

But this is not giving me unique Values from Array.

My Array:- {English, French, Japanese, Russian, Chinese Subtitles,English, French, Japanese, Russian, Chinese Subtitles}

Out Put :- [Japanese, Russian, French, Chinese Subtitles], Chinese Subtitles, [English, English]

Upvotes: 22

Views: 136587

Answers (12)

Akshay kaler
Akshay kaler

Reputation: 11

If your array satisfied these two conditions -:

  1. Only duplicates and single value allowed (No triplicate or greater allowed)

  2. There should only be one unique value in the array

     // Use Bitwise 'exclusive or' operator to find unique value 
     int result = array[0];
     for (int i = 1; i < array.length; i++) {
         result  ^= array[i];
     }
     System.out.println(result);
    

    } }

Upvotes: 1

GovindaRaju
GovindaRaju

Reputation: 31

public static int[] findAndReturnUniqueIntArray(int[] arr) {
    int[] distinctElements = {};
    int newArrLength = distinctElements.length;
    for (int i = 0; i < arr.length; i++) {
        boolean exists = false;
        if (distinctElements.length == 0) {
            distinctElements = new int[1];
            distinctElements[newArrLength] = arr[i];
            newArrLength++;
        }

        else {
            for (int j = 0; j < distinctElements.length; j++) {
                if (arr[i] == distinctElements[j]) {
                    exists = true;
                    break;
                }
            }
            if (exists == false) {
                distinctElements = Arrays.copyOf(distinctElements, distinctElements.length+1);
                distinctElements[distinctElements.length-1] = arr[i];
                newArrLength++;
                exists = false;
            }
        }
    }
    return distinctElements;
}

Upvotes: 0

Nishchit
Nishchit

Reputation: 1

In python you can use Set.

s = Set()
data_list = [1,2,3,4]
s.update(data_list)

Upvotes: -2

Mustafa Shahoud
Mustafa Shahoud

Reputation: 640

If you don't wanna use Hashset or the new method in Java8 mentioned above you can write this code you just need first to sort the array so similar values will then be next to each other and then count the number of distinct pairs in adjacent cells.

    public static int solution(int[] A) {
    int count = 1;
    Arrays.sort(A);
    for (int i = 1; i < A.length - 1; i++) {
        if (A[i] != A[i + 1]) {
            count++;
        }
    }
    return count;
}

Upvotes: 3

Nimeshika Prabodhani
Nimeshika Prabodhani

Reputation: 189

Let's see how to find distinct values from an array.

  public class Distinct  {
        public static void main(String args[]) {
             int num[]={1,4,3,2,6,7,4,2,1,2,8,6,7};
                for(int i=0; i<num.length; i++){
                    boolean isdistinct = true;
                    for(int j=0; j<i; j++){
                        if(num[i] == num[j]){
                            isdistinct =false;
                            break;
                        }
                   }
                    if(isdistinct){
                        System.out.print(num[i]+" ");
                    }
               }
           }
     }

Upvotes: 0

Bohemian
Bohemian

Reputation: 424983

You can do it in one line in java 7:

String[] unique = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);

and shorter and simpler in java 8:

String[] unique = Arrays.stream(array).distinct().toArray(String[]::new);

Upvotes: 62

Frederic Leitenberger
Frederic Leitenberger

Reputation: 2019

Using the Stream API of Java 8 this is a solution with a generic Array type:

public static <T> T[] makeUnique(T... values)
{
    return Arrays.stream(values).distinct().toArray(new IntFunction<T[]>()
    {

        @Override
        public T[] apply(int length)
        {
            return (T[]) Array.newInstance(values.getClass().getComponentType(), length);
        }

    });
}

It works for any Object type array, but not for primitive arrays.

For primitive arrays it looks like this:

public static int[] makeUnique(int... values)
{
    return Arrays.stream(values).distinct().toArray();
}

And finally here is a little unit test:

@Test
public void testMakeUnique()
{
    assertArrayEquals(new String[] { "a", "b", "c" }, makeUnique("a", "b", "c", "b", "a"));
    assertArrayEquals(new Object[] { "a", "b", "c" }, makeUnique(new Object[] { "a", "b", "c", "b", "a" }));
    assertArrayEquals(new Integer[] { 1, 2, 3, 4, 5 }, makeUnique(new Integer[] { 1, 2, 2, 3, 3, 3, 1, 4, 5, 5, 5, 1 }));
    assertArrayEquals(new int[] { 1, 2, 3, 4, 5 }, makeUnique(new int[] { 1, 2, 2, 3, 3, 3, 1, 4, 5, 5, 5, 1 }));
}

Upvotes: 2

flk
flk

Reputation: 31

HashSet will do the job.

You can try this:

List<String> newList = new ArrayList<String>(new HashSet<String>(oldList));

Upvotes: 3

qasim azam
qasim azam

Reputation: 38

This code will calculates distinct elements from an array, then finds their occurrence. And calculates percentage and save it to hashmap.

int _occurrence = 0;
        String[] _fruits = new String[] {"apple","apple","banana","mango","orange","orange","mango","mango","banana","banana","banana","banana","banana"};
        List<String> _initialList = Arrays.asList(_fruits);
        Set<String> treesetList = new TreeSet<String>(_initialList);
        String[] _distinct =  (String[]) treesetList.toArray(new String[0]);

        HashMap<String,String> _map = new HashMap<String,String>();
        int _totalElement = _fruits.length;
        for(int x=0;x<_distinct.length;x++){
            for(int i=0;i<_fruits.length;i++){
                if(_distinct[x].equals(_fruits[i])){
                    ++_occurrence;
                }
            }
            double _calPercentage = Math.round((((double)_occurrence/(double)_totalElement)*100));
            _map.put(_distinct[x], String.valueOf(_calPercentage+"%"));
            _occurrence = 0;
        }
        System.out.println(_map);

Upvotes: 0

Parvin Gasimzade
Parvin Gasimzade

Reputation: 26012

Why did you first add items into array and then convert it to string? Just iterate over tha array and copy them to Set.Then print new created set which holds unique values.

Set<String> set = new HashSet<String>();
for (int i = 0; i < al.length; i++) {
    set.add(al[i]);
}

for (String str : set) {
    System.out.println(str);
}

Upvotes: 0

Nikolay Kuznetsov
Nikolay Kuznetsov

Reputation: 9579

Try instead of this

Set<String> set = new HashSet<String>();

to call this

set.addAll(trimmedArray);

Upvotes: 0

Oscar Castiblanco
Oscar Castiblanco

Reputation: 1646

You could get two sets, one with all the subtitles, and the other with the duplicates

String[] trimmedArray = new String[items.length];
Set<String> subtitles = new HashSet<String>();
Set<String> duplicatedSubtitles = new HashSet<String>();

foreach(String subtitle : trimmedArray){
    subtitle = subtitle.trim();
    if(subtitles.contains(subtitle)){
        duplicatedSubtitles.add(subtitle);
    }
    subtitles.add(subtitle);
}

Upvotes: 0

Related Questions