0
votes

Comment stocker des doublons d'une arraylist avec un montant

J'ai un problème dans lequel je veux conserver le tableau d'origine et que je souhaite faire deux arraylistes distincts où l'on ne contient aucun duplicate et l'autre la quantité d'éléments dans la première arrangeuse. Par exemple: xxx


3 commentaires

Comment voulez-vous stocker entier dans ArrayList comme des occurrences? N'est-il pas préférable de contenir une variable ou de prendre des articles. Est-ce que l'article est votre classe ou c'est juste un exemple?


Pourquoi pas seulement créer un mappe <élément, entier> où la clé est l'élément et la valeur est la fréquence


Si l'élément est un pojo , quelle est la règle pour déterminer leur égalité?


7 Réponses :


0
votes

Le code ci-dessous montre un exemple de ce dont vous avez besoin, mais au lieu de l'article (je ne sais pas si vous le mettez comme exemple ou votre classe) Il existe une chaîne pour stocker des éléments et entier pour les occurrences.

Pour stocker des éléments.

Sans doublons, je suggère d'utiliser SET P>

public static void main(String[] args) {
    ArrayList<String> items = new ArrayList<String>(); 
    ArrayList<String> items2 = new ArrayList<String>(); 
    ArrayList<Integer> occurences = new ArrayList<Integer>();

    items.add("bandana");
    items.add("bandana");
    items.add("bandana");

    items2.addAll(new HashSet<>(items)); // create Hashset to remove duplicates and add again to Arraylist
    occurences.add(items.size()); // add size of items list as first element

    items.forEach(System.out::println);   // Print: "bandana" "bandana" "bandana"
    items2.forEach(System.out::println);  // Print: "bandana"
    occurences.forEach(System.out::println); // Print: 1
}


0 commentaires

0
votes

Ce n'est probablement pas la façon la plus efficace de le faire, mais j'essaierais quelque chose comme ceci: xxx

Vous voudrez peut-être modifier élément sur vers int pour la liste d'occurrences.


0 commentaires

0
votes

Aucun doublon dans la collection

pour la collection qui ne devrait avoir aucun élément en double, utilisez un SET <élément> au lieu d'une liste arrayliste <élément> . La structure de données définir ne stockera pas les doublons . Étant donné que élément est un objet personnalisé que vous avez créé, vous devrez remplacer le HashCode et est égal à la méthode dans votre élément Classe.

Cette approche est O (1) - qui est bien meilleure que de garder une arrayliste <élément> et itération de l'itération et de la recherche d'un duplicata (qui sera o (n) au pire).

occurrences

pour le problème des occurrences, au lieu de garder vos articles dans une arraylist , gardez-les dans une carte <élément, entier> . Cela fera mapper l'article sur le nombre d'événements qu'il y en a.

Utilisation de la carte, vous devrez obtenir la clé, qui correspond à l'élément vous êtes sur le point d'ajouter. S'il existe déjà sur la carte, ajoutez-en simplement une à la valeur de cette touche (numéro d'occurrence).

S'ils n'existent pas encore (c'est la première fois que cet article < / code> sera inséré dans la carte), ajoutez-le simplement à la carte et définissez la valeur sous forme 1.

L'utilisation d'une carte sera également une solution de manière complète, comme il sera également < Strong> O (1) , au lieu de O (N) Si un ArrayList <élément> sera utilisé.

Exemple: xxx


0 commentaires

0
votes

En supposant que vous puissiez utiliser des flux Java 8, vous pouvez également le faire de cette façon: xxx

au lieu de deux listes avec les valeurs distinctes et les occurrences que vous aurez une carte avec l'élément lui-même comme clé (fonction.Identifity ()) et le nombre de searys comme valeur (collectionneurs.Counting ()).


0 commentaires

0
votes

C'est ma solution à l'aide de flux et de fonctions Lambda. J'ai moddifié occurrence pour être un mappe <élément, entier> afin que nous puissions compter par article xxx

l'utilisation très cool de < Code> Fusionner a été trouvé dans Cette réponse . Puisque nous ne savons pas ce que item i j'ai testé cela à l'aide de chaîne à la place, donc est égal à etc. a fonctionné correctement


0 commentaires

0
votes

Utilisation de Lambdas pour obtenir une liste de valeurs distinctes:

Map<Item, Integer> m = new HashMap();
items.stream().forEach(k-> m.merge(k,1, Integer::sum));
ArrayList occurrences = new ArrayList(m.values());


0 commentaires

0
votes

Vous pouvez générer chaque liste comme ci-dessous,

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;

public class Main
{
  public static void main(String args[])
  {
    ArrayList<String> items = new ArrayList<>();
    ArrayList<String> items2 = new ArrayList<>();
    ArrayList<Integer> occurrences = new ArrayList<>();

    items.addAll(Arrays.asList("bandana", "bandana", "bandana", "abc", "abc"));

    items2.addAll(new LinkedHashSet<>(items));

    for (String item : items2)
    {
      occurrences.add(Collections.frequency(items, item));
    }

    System.out.println(items);
    System.out.println(items2);
    System.out.println(occurrences);
  }
}


0 commentaires