7

I am trying to write a program which will generate a random ten integer array(integers between 1 and 6) and then I have to form another array with all duplicates removed. So {1,3,5,5,3,4,2,2,2,1} should return {1,3,5,4,2}. The problem is that I get an answer but the output array contains 0s in the places where the duplicates were and I do not know how to decrease the length of the temp array(if it is even possible). Here is my program.:

import java.util.*;
public class Lab9Tut12{
public static void main (String[]args){
    int [] numbers = new int[10];
    //int length = 10;
    int[] temp = new int[length];
    for(int i=0;i<10;i++){
        numbers [i] = (int)(Math.random()*6+1);
        System.out.print(numbers [i]);
        System.out.println();
    }
    for(int i=1;i<10;i++){
       if(numbers[i-1]!=numbers[i]){
         temp[i]= numbers[i];
         //length--;
       }
    }
    System.out.println(Arrays.toString(temp));
}

}

3
  • You can't decrease array length, because it has a fixed size that can't be change at the run time. Commented Mar 12, 2014 at 13:27
  • do you need the first array? if not you can verify when you input the new value for duplicates. Or you can use a Set (doesn't allow duplicates). Commented Mar 12, 2014 at 13:29
  • You should accept an answer if any of them helped you. Commented Mar 12, 2014 at 13:49

5 Answers 5

14

A nice way to do this is to utilize a Set. That's a structure, that contains only unique values.

Set<Integer> set = new HashSet<Integer>();
int[] array = {1,1,2,2,2,3,3,4,5,6,8};

for (int num : array) {
    set.add(num);
}

System.out.println(set);

Outputs:

[1, 2, 3, 4, 5, 6, 8]

To convert the set to an array you can use set.toArray().

Sign up to request clarification or add additional context in comments.

2 Comments

That's really good, as the add method wont add an integer if it's already in the set. Cheers! :)
Danger! Iteration order in a HashSet is not guaranteed. You want to use a LinkedHashSet if iteration order matters.
4

Use Set instead. Put all the array values in a set and then convert back to array.

Set<Integer> numbersSet = new HashSet<>(Arrays.asList(numbers));

Integer[] uniqueNumbers = numbersSet.toArray(new Integer[0]);

Set will eliminate all you duplicates and you don't need to do anything for it. Just put the numbers there.

Comments

2

You could use a Set to store your unique random numbers. Set API

Set<Integer> set = new HashSet<Integer>();
set.add(randomNumber);
...

Later convert to a list:

 List<Integer> list = new ArrayList<Integer>(set);

3 Comments

Thank you for the fast responce ! :)
What is the difference between Set and a List, what is the advantage of one another ? :)
A Set has no duplicate elements.
1

Try use this piece of code. Set does not allow you to put 2 same objects.

import java.util.HashSet;
import java.util.Set;

public class MyClass {

    public static void main(String[] args) {

        int size = 10;
        Set<Integer> numbers = new HashSet<Integer>();

        for (int i = 0; i < size; i++) {
            numbers.add((int) (Math.random() * 6 + 1));
        }

        System.out.println(numbers);

    }
}

1 Comment

Thank you, that's really great way to deal with arrays that we do not know the length of. Cheers !
1

Using a Set is nice, however you'll have a problem: its .toArray() will return an Integer[], not an int[] (and you cannot have a Set<int>).

Here is a solution which still uses a set, but differently:

public static int[] onlyUniqueElements(final int[] inputArray)
{
    final Set<Integer> set = new HashSet<>();
    final int[] tmp = new int[inputArray.length];
    int index = 0;
    for (final int i: inputArray)
        if (set.add(i))
            tmp[index++] = i;

    return Arrays.copyOfRange(tmp, 0, index);
}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.