Comment supprimer efficacement les doublons d'un tableau sans utiliser Set

on m'a demandé d'écrire ma propre implémentation pour supprimer les valeurs dupliquées dans un tableau. Voici ce que j'ai créé. Mais après des tests avec 1.000.000 d'éléments il a fallu beaucoup de temps pour terminer. Y a-t-il quelque chose que je puisse faire pour améliorer mon algorithme ou des bogues à supprimer ?

j'ai besoin d'écrire ma propre implémentation - pas d'utiliser Set , HashSet etc. Ou tout autre outil tel que les itérateurs. Simplement un tableau à supprimer dupliquer.

public static int[] removeDuplicates(int[] arr) {

    int end = arr.length;

    for (int i = 0; i < end; i++) {
        for (int j = i + 1; j < end; j++) {
            if (arr[i] == arr[j]) {                  
                int shiftLeft = j;
                for (int k = j+1; k < end; k++, shiftLeft++) {
                    arr[shiftLeft] = arr[k];
                }
                end--;
                j--;
            }
        }
    }

    int[] whitelist = new int[end];
    for(int i = 0; i < end; i++){
        whitelist[i] = arr[i];
    }
    return whitelist;
}
35
demandé sur Community 2013-07-31 13:50:29

30 réponses

vous pouvez prendre l'aide de Set collection

int end = arr.length;
Set<Integer> set = new HashSet<Integer>();

for(int i = 0; i < end; i++){
  set.add(arr[i]);
}

maintenant si vous voulez itérer à travers ce ensemble , il ne contiendra que des valeurs uniques. Le code itératif est comme ceci :

Iterator it = set.iterator();
while(it.hasNext()) {
  System.out.println(it.next());
}
34
répondu Android Killer 2014-05-02 00:47:12

Note: je suppose que le tableau est trié.

Code:

int[] input = new int[]{1, 1, 3, 7, 7, 8, 9, 9, 9, 10};
int current = input[0];
boolean found = false;

for (int i = 0; i < input.length; i++) {
    if (current == input[i] && !found) {
        found = true;
    } else if (current != input[i]) {
        System.out.print(" " + current);
        current = input[i];
        found = false;
    }
}
System.out.print(" " + current);

sortie:

  1 3 7 8 9 10
13
répondu Kick Buttowski 2018-07-30 21:16:37

puisque vous pouvez supposer que la gamme se situe entre 0-1000 Il ya une solution très simple et efficace

//Throws an exception if values are not in the range of 0-1000
public static int[] removeDuplicates(int[] arr) {
    boolean[] set = new boolean[1001]; //values must default to false
    int totalItems = 0;

    for (int i = 0; i < arr.length; ++i) {
        if (!set[arr[i]]) {
            set[arr[i]] = true;
            totalItems++;
        }
    }

    int[] ret = new int[totalItems];
    int c = 0;
    for (int i = 0; i < set.length; ++i) {
        if (set[i]) {
            ret[c++] = i;
        }
    }
    return ret;
}

ceci s'exécute dans le temps linéaire O(n). Avertissement: le tableau retourné est trié donc si c'est illégal alors cette réponse n'est pas valide.

8
répondu Esailija 2016-08-18 14:10:00

légère modification du code d'origine lui-même, par suppression de la boucle interne.

public static int[] removeDuplicates(int[] arr){
    int end = arr.length;

    for (int i = 0; i < end; i++) {
        for (int j = i + 1; j < end; j++) {
            if (arr[i] == arr[j]) {                  
                /*int shiftLeft = j;
                for (int k = j+1; k < end; k++, shiftLeft++) {
                    arr[shiftLeft] = arr[k];
                }*/
                arr[j] = arr[end-1];
                end--;
                j--;
            }
        }
    }

    int[] whitelist = new int[end];
    /*for(int i = 0; i < end; i++){
        whitelist[i] = arr[i];
    }*/
    System.arraycopy(arr, 0, whitelist, 0, end);
    return whitelist;
}
6
répondu Pavan Kumar 2015-04-14 17:17:44
class Demo 
{
    public static void main(String[] args) 
    {
        int a[]={3,2,1,4,2,1};
        System.out.print("Before Sorting:");
        for (int i=0;i<a.length; i++ )
        {
            System.out.print(a[i]+"\t");
        }
        System.out.print ("\nAfter Sorting:");
        //sorting the elements
        for(int i=0;i<a.length;i++)
        {
            for(int j=i;j<a.length;j++)
            {
                if(a[i]>a[j])
                {
                    int temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }

            }
        }

        //After sorting
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+"\t");
        }
        System.out.print("\nAfter removing duplicates:");
        int b=0;
        a[b]=a[0];
        for(int i=0;i<a.length;i++)
        {
            if (a[b]!=a[i])
            {
                b++;
                a[b]=a[i];
            }
        }
        for (int i=0;i<=b;i++ )
        {
            System.out.print(a[i]+"\t");
        }
    }
}
  OUTPUT:Before Sortng:3 2 1 4 2 1 After Sorting:1 1 2 2 3 4 
                Removing Duplicates:1 2 3 4
6
répondu user3752541 2017-01-07 04:55:43

il existe de nombreuses solutions à ce problème.

  1. Le genre de l'approche

    • vous triez votre tableau et résolvez seulement des éléments uniques
  2. L'approche

    • vous déclarez un HashSet où vous mettez tous les articles, alors vous n'avez que des uniques.
  3. Vous créez un tableau booléen qui représente les éléments déjà retournés (cela dépend de vos données dans le tableau).

si vous traitez avec une grande quantité de données, je choisirais le 1. solution. Comme vous n'allouez pas de mémoire supplémentaire et le tri est assez rapide. Pour un petit ensemble de données, la complexité serait n ^ 2 mais pour un grand i serait n log N.

5
répondu Damian Leszczyński - Vash 2013-07-31 10:04:02

Que si vous créez deux booléens tableaux: 1 pour les valeurs négatives et 1 pour les valeurs positives et init tout faux.

ensuite vous cycle thorugh le tableau d'entrée et la recherche dans les tableaux si vous avez déjà encodé la valeur. Si non, vous l'ajoutez au tableau de sortie et le marquez comme déjà utilisé.

4
répondu DaMachk 2013-07-31 09:59:02

c'est une façon simple de trier les éléments dans le tableau

public class DublicatesRemove {
    public static void main(String args[]) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("enter size of the array");
        int l = Integer.parseInt(br.readLine());
        int[] a = new int[l];
        // insert elements in the array logic
        for (int i = 0; i < l; i++) 
        {
            System.out.println("enter a element");
            int el = Integer.parseInt(br.readLine());
            a[i] = el;
        }
        // sorting elements in the array logic
        for (int i = 0; i < l; i++) 
        {
            for (int j = 0; j < l - 1; j++) 
            {
                if (a[j] > a[j + 1])
                {
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
        // remove duplicate elements logic
        int b = 0;
        a[b] = a[0];
        for (int i = 1; i < l; i++)
        {
            if (a[b] != a[i])
            {
                b++;
                a[b]=a[i];

            }

        }
        for(int i=0;i<=b;i++)
        {
            System.out.println(a[i]);
        }


    }
}
2
répondu Tummala srikanth 2013-11-06 02:14:41
package com.pari.practice;

import java.util.HashSet;
import java.util.Iterator;

import com.pari.sort.Sort;

public class RemoveDuplicates {

 /**
 * brute force- o(N square)
 * 
 * @param input
 * @return
 */
public static int[] removeDups(int[] input){
    boolean[] isSame = new boolean[input.length];
    int sameNums = 0;

    for( int i = 0; i < input.length; i++ ){
        for( int j = i+1; j < input.length; j++){
            if( input[j] == input[i] ){ //compare same
                isSame[j] = true;
                sameNums++;
            }
        }
    }

    //compact the array into the result.
    int[] result = new int[input.length-sameNums];
    int count = 0;
    for( int i = 0; i < input.length; i++ ){
        if( isSame[i] == true) {
            continue;
        }
        else{
            result[count] = input[i];
            count++;
        }
    }

    return result;
}

/**
 * set - o(N)
 * does not guarantee order of elements returned - set property
 * 
 * @param input
 * @return
 */
public static int[] removeDups1(int[] input){
    HashSet myset = new HashSet();

    for( int i = 0; i < input.length; i++ ){
        myset.add(input[i]);
    }

    //compact the array into the result.
    int[] result = new int[myset.size()];
    Iterator setitr = myset.iterator();
    int count = 0;
    while( setitr.hasNext() ){
        result[count] = (int) setitr.next();
        count++;
    }

return result;
}

/**
 * quicksort - o(Nlogn)
 * 
 * @param input
 * @return
 */
public static int[] removeDups2(int[] input){
    Sort st = new Sort();
    st.quickSort(input, 0, input.length-1); //input is sorted

    //compact the array into the result.
    int[] intermediateResult = new int[input.length];
    int count = 0;
    int prev = Integer.MIN_VALUE;
    for( int i = 0; i < input.length; i++ ){
        if( input[i] != prev ){
            intermediateResult[count] = input[i];
            count++;
        }
        prev = input[i];
    }

    int[] result = new int[count];
    System.arraycopy(intermediateResult, 0, result, 0, count);

    return result;
}


public static void printArray(int[] input){
    for( int i = 0; i < input.length; i++ ){
        System.out.print(input[i] + " ");
    }
}

public static void main(String[] args){
    int[] input = {5,6,8,0,1,2,5,9,11,0};
    RemoveDuplicates.printArray(RemoveDuplicates.removeDups(input));
    System.out.println();
    RemoveDuplicates.printArray(RemoveDuplicates.removeDups1(input));
    System.out.println();
    RemoveDuplicates.printArray(RemoveDuplicates.removeDups2(input));
}
}

sortie: 5 6 8 0 1 2 9 11

0 1 2 5 6 8 9 11

0 1 2 5 6 8 9 11

je viens d'écrire le code ci-dessus pour essayer. grâce.

2
répondu 2014-10-15 04:55:40

vous devez trier votre tableau puis ensuite boucle et supprimer les doublons. Comme vous ne pouvez pas utiliser d'autres outils, vous devez écrire du code be vous-même.

vous pouvez facilement trouver des exemples de quicksort en Java sur l'internet (sur lequel cet exemple est basé).

public static void main(String[] args) throws Exception {
    final int[] original = new int[]{1, 1, 2, 8, 9, 8, 4, 7, 4, 9, 1};
    System.out.println(Arrays.toString(original));
    quicksort(original);
    System.out.println(Arrays.toString(original));
    final int[] unqiue = new int[original.length];
    int prev = original[0];
    unqiue[0] = prev;
    int count = 1;
    for (int i = 1; i < original.length; ++i) {
        if (original[i] != prev) {
            unqiue[count++] = original[i];
        }
        prev = original[i];
    }
    System.out.println(Arrays.toString(unqiue));
    final int[] compressed = new int[count];
    System.arraycopy(unqiue, 0, compressed, 0, count);
    System.out.println(Arrays.toString(compressed));
}

private static void quicksort(final int[] values) {
    if (values.length == 0) {
        return;
    }
    quicksort(values, 0, values.length - 1);
}

private static void quicksort(final int[] values, final int low, final int high) {
    int i = low, j = high;
    int pivot = values[low + (high - low) / 2];
    while (i <= j) {
        while (values[i] < pivot) {
            i++;
        }
        while (values[j] > pivot) {
            j--;
        }
        if (i <= j) {
            swap(values, i, j);
            i++;
            j--;
        }
    }
    if (low < j) {
        quicksort(values, low, j);
    }
    if (i < high) {
        quicksort(values, i, high);
    }
}

private static void swap(final int[] values, final int i, final int j) {
    final int temp = values[i];
    values[i] = values[j];
    values[j] = temp;
}

ainsi le processus se déroule en 3 étapes.

  1. trier le tableau - O(nlgn)
  2. Supprimer duplicata - O(n)
  3. Compact le tableau O(n)

cela améliore donc considérablement votre approche O(n^3) .

sortie:

[1, 1, 2, 8, 9, 8, 4, 7, 4, 9, 1]
[1, 1, 1, 2, 4, 4, 7, 8, 8, 9, 9]
[1, 2, 4, 7, 8, 9, 0, 0, 0, 0, 0]
[1, 2, 4, 7, 8, 9]

MODIFIER

OP déclare les valeurs à l'intérieur du tableau n'ont pas vraiment d'importance. Mais je peux supposer que la gamme est entre 0-1000 . C'est un cas classique où un O(n) peut être utilisé.

Nous créons un tableau de taille range +1 , dans ce cas 1001 . Nous faisons ensuite une boucle sur les données et incrémentons les valeurs sur chaque indice correspondant au point de données.

nous pouvons alors compacter le tableau résultant, en laissant tomber les valeurs qui n'ont pas été incrémentées. Cela rend les valeurs uniques que nous ignorons le nombre de.

public static void main(String[] args) throws Exception {
    final int[] original = new int[]{1, 1, 2, 8, 9, 8, 4, 7, 4, 9, 1, 1000, 1000};
    System.out.println(Arrays.toString(original));
    final int[] buckets = new int[1001];
    for (final int i : original) {
        buckets[i]++;
    }
    final int[] unique = new int[original.length];
    int count = 0;
    for (int i = 0; i < buckets.length; ++i) {
        if (buckets[i] > 0) {
            unique[count++] = i;
        }
    }
    final int[] compressed = new int[count];
    System.arraycopy(unique, 0, compressed, 0, count);
    System.out.println(Arrays.toString(compressed));
}

sortie:

[1, 1, 2, 8, 9, 8, 4, 7, 4, 9, 1, 1000, 1000]
[1, 2, 4, 7, 8, 9, 1000]
1
répondu Boris the Spider 2013-07-31 10:47:35

modifier: pour un tableau trié, il suffit de vérifier l'index suivant

//sorted data!
public static int[] distinct(int[] arr) {
    int[] temp = new int[arr.lenght];

    int count = 0;
    for (int i = 0; i < arr.length; i++) {
        int current = arr[i];

        if(count > 0 )
            if(temp[count - 1] == current)
                continue;

        temp[count] = current;
        count++;
    }

    int[] whitelist = new int[count];
    System.arraycopy(temp, 0, whitelist, 0, count);

    return whitelist;
}
1
répondu mc_fish 2013-07-31 12:43:04
public static void main(String args[]) {
    int[] intarray = {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};

    Set<Integer> set = new HashSet<Integer>();
    for(int i : intarray) {
        set.add(i);
    }

    Iterator<Integer> setitr = set.iterator();
    for(int pos=0; pos < intarray.length; pos ++) {
        if(pos < set.size()) {
            intarray[pos] =setitr.next();
        } else {
            intarray[pos]= 0;
        }
    }

    for(int i: intarray)
    System.out.println(i);
}
1
répondu Programmer 2014-06-10 07:00:45

je sais que c'est un peu mort, mais je l'ai écrit pour mon usage personnel. C'est plus ou moins le même que l'ajout d'un hashset, puis en tirant tous les éléments. Il devrait fonctionner dans le pire des cas.

    public static int[] removeDuplicates(int[] numbers) {
    Entry[] entries = new Entry[numbers.length];
    int size = 0;
    for (int i = 0 ; i < numbers.length ; i++) {
        int nextVal = numbers[i];
        int index = nextVal % entries.length;
        Entry e = entries[index];
        if (e == null) {
            entries[index] = new Entry(nextVal);
            size++;
        } else {
            if(e.insert(nextVal)) {
                size++;
            }
        }
    }
    int[] result = new int[size];
    int index = 0;
    for (int i = 0 ; i < entries.length ; i++) {
        Entry current = entries[i];
        while (current != null) {
            result[i++] = current.value;
            current = current.next;
        }
    }
    return result;
}

public static class Entry {
    int value;
    Entry next;

    Entry(int value) {
        this.value = value;
    }

    public boolean insert(int newVal) {
        Entry current = this;
        Entry prev = null;
        while (current != null) {
            if (current.value == newVal) {
                return false;
            } else if(current.next != null) {
                prev = current;
                current = next;
            }
        }
        prev.next = new Entry(value);
        return true;
    }
}
1
répondu Eagle 2014-06-16 05:49:20
int tempvar=0; //Variable for the final array without any duplicates
     int whilecount=0;    //variable for while loop
     while(whilecount<(nsprtable*2)-1) //nsprtable can be any number
     {
//to check whether the next value is idential in case of sorted array       
if(temparray[whilecount]!=temparray[whilecount+1])
        {
            finalarray[tempvar]=temparray[whilecount];
            tempvar++;
            whilecount=whilecount+1;
        }
        else if (temparray[whilecount]==temparray[whilecount+1])
        {
            finalarray[tempvar]=temparray[whilecount];
            tempvar++;
            whilecount=whilecount+2;
        }
     }

Espérons que cette aide ou résout le but.

1
répondu driftking9987 2014-08-04 16:16:33

comme cette question reçoit encore beaucoup d'attention, j'ai décidé d'y répondre en copiant cette réponse de la revue de Code.SE :

vous suivez la même philosophie que la bulle sorte, qui est très, très, très lent. Avez-vous essayé?:

  • triez votre réseau non ordonné avec quicksort . Quicksort est beaucoup plus rapide que le tri à bulles (je vous savez, vous ne triez pas, mais l'algorithme vous suivre est presque le même que le tri à bulles pour parcourir le tableau).

  • puis commencer à supprimer les doublons (les valeurs répétées seront à côté de chaque autre.) Dans une boucle for vous pouvez avoir deux indices: source et destination . (Sur chaque boucle vous copiez source à destination à moins qu'ils sont les mêmes, et augmentent les deux par 1). Chaque fois que vous trouver un dupliquer votre incrément source (et n'effectuez pas la copie). @morgano

1
répondu ashur 2017-04-13 12:40:33
public static int[] removeDuplicates(int[] arr){
    HashSet<Integer> set = new HashSet<>();
    final int len = arr.length;
    //changed end to len
    for(int i = 0; i < len; i++){
        set.add(arr[i]);
    }

    int[] whitelist = new int[set.size()];
    int i = 0;
    for (Iterator<Integer> it = set.iterator(); it.hasNext();) {
        whitelist[i++] = it.next();
    }
    return whitelist;
}

fonctionne dans le temps O(N) au lieu de votre temps O(N^3)

1
répondu David Xu 2018-02-18 14:59:52
public static void main(String[] args) {
        Integer[] intArray = { 1, 1, 1, 2, 4, 2, 3, 5, 3, 6, 7, 3, 4, 5 };
        Integer[] finalArray = removeDuplicates(intArray);
        System.err.println(Arrays.asList(finalArray));
    }

    private static Integer[] removeDuplicates(Integer[] intArray) {
        int count = 0;
        Integer[] interimArray = new Integer[intArray.length];
        for (int i = 0; i < intArray.length; i++) {
            boolean exists = false;
            for (int j = 0; j < interimArray.length; j++) {
                if (interimArray[j]!=null && interimArray[j] == intArray[i]) {
                    exists = true;
                }
            }
            if (!exists) {
                interimArray[count] = intArray[i];
                count++;
            }
        }
        final Integer[] finalArray = new Integer[count];
        System.arraycopy(interimArray, 0, finalArray, 0, count);
        return finalArray;
    }
0
répondu venkata harish 2015-09-11 07:53:30

je pense que L'idée de tueur Android est super, mais je me demandais si nous pouvions tirer parti de HashMap. J'ai donc fait une petite expérience. Et J'ai trouvé que HashMap semble plus rapide que HashSet.

voici le code:

    int[] input = new int[1000000];

    for (int i = 0; i < input.length; i++) {
        Random random = new Random();
        input[i] = random.nextInt(200000);
    }

    long startTime1 = new Date().getTime();
    System.out.println("Set start time:" + startTime1);

    Set<Integer> resultSet = new HashSet<Integer>();

    for (int i = 0; i < input.length; i++) {
        resultSet.add(input[i]);
    }

    long endTime1 = new Date().getTime();
    System.out.println("Set end time:"+ endTime1);
    System.out.println("result of set:" + (endTime1 - startTime1));     
    System.out.println("number of Set:" + resultSet.size() + "\n");

    long startTime2 = new Date().getTime();
    System.out.println("Map start time:" + startTime1);

    Map<Integer, Integer> resultMap = new HashMap<Integer, Integer>();

    for (int i = 0; i < input.length; i++) {
        if (!resultMap.containsKey(input[i]))
            resultMap.put(input[i], input[i]);
    }

    long endTime2 = new Date().getTime();
    System.out.println("Map end Time:" + endTime2);
    System.out.println("result of Map:" + (endTime2 - startTime2));
    System.out.println("number of Map:" + resultMap.size());

voici le résultat:

Set start time:1441960583837
Set end time:1441960583917
result of set:80
number of Set:198652

Map start time:1441960583837
Map end Time:1441960583983
result of Map:66
number of Map:198652
0
répondu jonathan 2015-09-11 08:35:49

ceci n'utilise pas Set, Map, List ou toute collection supplémentaire, seulement deux tableaux:

package arrays.duplicates;

import java.lang.reflect.Array;
import java.util.Arrays;

public class ArrayDuplicatesRemover<T> {

    public static <T> T[] removeDuplicates(T[] input, Class<T> clazz) {
        T[] output = (T[]) Array.newInstance(clazz, 0);
        for (T t : input) {
            if (!inArray(t, output)) {
                output = Arrays.copyOf(output, output.length + 1);
                output[output.length - 1] = t;
            }
        }
        return output;
    }

    private static <T> boolean inArray(T search, T[] array) {
        for (T element : array) {
            if (element.equals(search)) {
                return true;
            }
        }
        return false;
    }

}

Et le principal pour le tester

package arrays.duplicates;

import java.util.Arrays;

public class TestArrayDuplicates {

    public static void main(String[] args) {
        Integer[] array = {1, 1, 2, 2, 3, 3, 3, 3, 4};
        testArrayDuplicatesRemover(array);
    }

    private static void testArrayDuplicatesRemover(Integer[] array) {
        final Integer[] expectedResult = {1, 2, 3, 4};
        Integer[] arrayWithoutDuplicates = ArrayDuplicatesRemover.removeDuplicates(array, Integer.class);
        System.out.println("Array without duplicates is supposed to be: " + Arrays.toString(expectedResult));
        System.out.println("Array without duplicates currently is: " + Arrays.toString(arrayWithoutDuplicates));
        System.out.println("Is test passed ok?: " + (Arrays.equals(arrayWithoutDuplicates, expectedResult) ? "YES" : "NO"));
    }

}

et la sortie:

Array without duplicates is supposed to be: [1, 2, 3, 4]
Array without duplicates currently is: [1, 2, 3, 4]
Is test passed ok?: YES
0
répondu Juan Furattini 2016-12-16 17:26:50

Que Diriez - vous de celui-ci, seulement pour le tableau trié de nombres, pour imprimer le tableau sans doublons, sans utiliser L'ensemble ou D'autres Collections, juste le tableau:

 public static int[] removeDuplicates(int[] array) {
    int[] nums =new int[array.length];
    int addedNum = 0;
    int j=0;
    for(int i=0;i<array.length;i++) {
        if (addedNum != array[i]) {
        nums[j] = array[i];
        j++;
        addedNum = nums[j-1];
        }
    }
    return Arrays.copyOf(nums, j);
}

tableau de 1040 nombres dupliqués traités en 33020 nanosecondes ( 0,033020 millisec ).

0
répondu pandabear 2017-01-19 18:58:10

Ok, donc vous ne pouvez pas utiliser Set ou d'autres collections. Une solution que je ne vois pas ici jusqu'à présent est celui basé sur l'utilisation d'un filtre de fleur , qui est essentiellement un ensemble de bits, donc peut-être que cela passe vos exigences.

Le filtre de Bloom est une belle et très pratique technique, rapide et efficace, qui peut être utilisé pour faire une vérification rapide de l'existence d'un élément dans un ensemble sans stocker l'ensemble lui-même ou les éléments. Il a un taux (généralement faible) de faux positifs, mais aucun taux de faux négatifs. En d'autres termes, pour votre question, si un filtre de Bloom vous dit qu'un élément n'a pas été vu jusqu'à présent, vous pouvez être sûr qu'il n'a pas. Mais si on dit qu'un élément a été vu, vous avez vraiment besoin de vérifier. Cela permet encore d'économiser beaucoup de temps s'il n'y a pas trop de doublons dans votre liste (pour ceux-là, il n'y a pas de boucle à faire, sauf dans le petit cas de probabilité d'un faux positif --vous avez généralement choisi ce taux basé sur combien d'espace vous êtes prêt à donner au filtre de fleur (règle de pouce: moins de 10 bits par élément unique pour un taux de faux positif de 1%).

il y a de nombreuses implémentations de filtres à fleurs, voir par exemple ici ou ici , donc je ne vais pas répéter cela dans cette réponse. Supposons simplement l'api décrite dans cette dernière référence, en particulier, la description de put(E e) :

true si les bits DU FILTRE À Bloom ont changé à la suite de cette opération. Si les bits ont changé, c'est définitivement l'objet de première fois a été ajouté au filtre. Si les bits n'ont pas changé, ce pourrait être la première fois que l'objet a été ajouté au filtre. (...)

une implémentation utilisant un tel filtre Bloom serait alors:

public static int[] removeDuplicates(int[] arr) {
    ArrayList<Integer> out = new ArrayList<>();
    int n = arr.length;
    BloomFilter<Integer> bf = new BloomFilter<>(...);  // decide how many bits and how many hash functions to use (compromise between space and false positive rate)

    for (int e : arr) {
        boolean might_contain = !bf.put(e);
        boolean found = false;
        if (might_contain) {
            // check if false positive
            for (int u : out) {
                if (u == e) {
                    found = true;
                    break;
                }
            }
        }
        if (!found) {
            out.add(e);
        }
    }
    return out.stream().mapToInt(i -> i).toArray();
}

évidemment, si vous pouvez modifier le tableau entrant en place, alors il n'y a pas besoin d'un ArrayList : à la fin, quand vous connaissez le nombre réel d'éléments uniques, juste arraycopy() ceux.

0
répondu Pierre D 2017-04-05 04:17:35

pourquoi tous les gens ne vérifient-ils pas cela en dessous des lignes?

je dois écrire ma propre implémentation - ne pas utiliser Set, HashSet, etc. Ou tout autre outil tel que les itérateurs. Simplement un tableau pour supprimer les doublons.

je poste la mise en œuvre très simple avec la prise en charge de la ligne ci-dessus.

public class RemoveDuplicates {

public static void main(String[] args) {

    int[] arr = { 1, 2, 3, 4, 2, 3, 1 }; // input array
    int len = arr.length;
    for (int i = 0; i < arr.length; i++) {
        for (int j = i + 1; j < len; j++) {
            if (arr[i] == arr[j]) {
                while (j < (len) - 1) {
                    arr[j] = arr[j - 1];
                    j++;
                }
                len--;
            }
        }
    }
    for (int i = 0; i < len; i++) {
        System.out.print("  " +arr[i]);
    }

   }
 }

entrée : 1, 2, 3, 4, 2, 3, 1

Sortie: 1 2 3 4

0
répondu Ved Prakash 2017-07-18 14:43:35

voici ma solution. La complexité temporelle est o (N^2)

public String removeDuplicates(char[] arr) {
        StringBuilder sb = new StringBuilder();

        if (arr == null)
            return null;
        int len = arr.length;

        if (arr.length < 2)
            return sb.append(arr[0]).toString();

        for (int i = 0; i < len; i++) {

            for (int j = i + 1; j < len; j++) {
                if (arr[i] == arr[j]) {
                    arr[j] = 0;

                }
            }
            if (arr[i] != 0)
                sb.append(arr[i]);
        }

        return sb.toString().trim();
    }
0
répondu Türkmen Mustafa Demirci 2017-10-18 08:05:48
public void removeDup(){ 
String[] arr = {"1","1","2","3","3"};
          boolean exists = false;
          String[] arr2 = new String[arr.length];
          int count1 = 0;
          for(int loop=0;loop<arr.length;loop++)
            {
              String val = arr[loop];
              exists = false;
              for(int loop2=0;loop2<arr2.length;loop2++)
              {     
                  if(arr2[loop2]==null)break;
                  if(arr2[loop2]==val){
                        exists = true;
                }
              }
              if(!exists) {
                    arr2[count1] = val;
                    count1++;
              }
            }
}
0
répondu Prathi 2017-11-15 13:04:46
 package javaa;

public class UniqueElementinAnArray 
{

 public static void main(String[] args) 
 {
    int[] a = {10,10,10,10,10,100};
    int[] output = new int[a.length];
    int count = 0;
    int num = 0;

    //Iterate over an array
    for(int i=0; i<a.length; i++)
    {
        num=a[i];
        boolean flag = check(output,num);
        if(flag==false)
        {
            output[count]=num;
            ++count;
        }

    }

    //print the all the elements from an array except zero's (0)
    for (int i : output) 
    {
        if(i!=0 )
            System.out.print(i+"  ");
    }

}

/***
 * If a next number from an array is already exists in unique array then return true else false
 * @param arr   Unique number array. Initially this array is an empty.
 * @param num   Number to be search in unique array. Whether it is duplicate or unique.
 * @return  true: If a number is already exists in an array else false 
 */
public static boolean check(int[] arr, int num)
{
    boolean flag = false;
    for(int i=0;i<arr.length; i++)
    {
        if(arr[i]==num)
        {
            flag = true;
            break;
        }
    }
    return flag;
}

}

0
répondu Avinash Pande 2018-04-20 05:56:20

C'est une question d'entrevue :Supprimer les doublons d'un tableau.Je n'utiliserai aucun ensemble ou collection. La solution complète est:

public class Test4 {
public static void main(String[] args) {
     int a[] = {1, 2, 2, 3, 3, 3, 6,6,6,6,6,66,7,65}; 
              int newlength =    lengthofarraywithoutduplicates(a);
              for(int i = 0 ; i < newlength ;i++) {
                  System.out.println(a[i]);
              }//for
}//main

private static int lengthofarraywithoutduplicates(int[] a) {
     int count = 1 ;
     for (int i = 1; i < a.length; i++) {
          int ch = a[i];
          if(ch != a[i-1]) {
              a[count++] = ch;
          }//if
    }//for
    return count;

}//fix

}//end1
0
répondu Soudipta Dutta 2018-04-22 21:31:23
public static int[] removeDuplicates(int[] arr) {

int end = arr.length;

 HashSet<Integer> set = new HashSet<Integer>(end);
    for(int i = 0 ; i < end ; i++){
        set.add(arr[i]);
    }
return set.toArray();
}
0
répondu Falguni 2018-07-27 18:45:58

veuillez cocher cette case. Cela fonctionnera pour les deux tableaux triés/non triés. La complexité est O (N^2) même que le tri de bulle. Oui, la complexité peut encore être améliorée avec le premier tri, puis la recherche binaire. Mais c'est assez simple pour travailler sur tous les cas sauf l'élément négatif (-1). Ceci peut aussi être modifié en utilisant une grande valeur entière au lieu de -1.

void remove_duplicates(int *A, int N)

{

int i,j;

for (i=1; i<N; i++) {
    if (A[i] == -1) continue;
    for (j=i+1; j<=N; j++) {
        if (A[i] == A[j])
            A[j] = -1;
    }
}
}

int main() {

int N;
int A[1001];
int i;

printf("Enter N: ");
scanf("%d", &N);
printf("Enter the elements:\n");
for (i=1; i<=N; i++)
    scanf("%d", &A[i]);

remove_duplicates(A, N);
for (i=1; i<=N; i++) {
    if (A[i] == -1)
        continue;
    printf("%d  ", A[i]);
}
printf("\n");

return 0;
}
-1
répondu PINTU KUMAR 2017-04-23 20:54:32

Heres un plus simple, la meilleure façon de le faire à l'aide de arraylists à la place:

public static final <T> ArrayList<T> removeDuplicates(ArrayList<T> in){
    ArrayList<T> out = new ArrayList<T>();
    for(T t : in) 
        if(!out.contains(t)) 
            out.add(t);
    return out;
}
-1
répondu Jeremiah 2018-08-15 13:30:55
public class RemoveDuplicates {
public Integer[] returnUniqueNumbers(Integer[] original,
        Integer[] uniqueNumbers) {
    int k = 0;  

    for (int j =  original.length - 1; j >= 0; j--) {
        boolean present = false;
        for (Integer u : uniqueNumbers) {
            if (u != null){
            if(u.equals(original[j])) {
                present = true;
            }}
        }
        if (present == false) {
            uniqueNumbers[k] = original[j];
            k++;
        }
    }
    return uniqueNumbers;
}

public static void main(String args[]) {
    RemoveDuplicates removeDup = new RemoveDuplicates();
    Integer[] original = { 10, 20, 40, 30, 50, 40, 30, 20, 10, 50, 50, 50,20,30,10,40 };
    Integer[] finalValue = new Integer[original.length + 1];

    // method to return unique values
    Integer[] unique = removeDup.returnUniqueNumbers(original, finalValue);

    // iterate to return unique values
    for (Integer u : unique) {
        if (u != null) {
            System.out.println("unique value : " + u);
        }
    }
}}

ce code gère un tableau non trié contenant plusieurs doublons pour la même valeur et renvoie des éléments uniques.

-2
répondu JavDev 2015-07-08 05:15:03