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:
7 Réponses :
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 }
Ce n'est probablement pas la façon la plus efficace de le faire, mais j'essaierais quelque chose comme ceci: Vous voudrez peut-être modifier élément code> sur
vers
int code> pour la liste d'occurrences. P> p>
pour la collection qui ne devrait avoir aucun élément en double, utilisez un Cette approche est pour le problème des occurrences, au lieu de garder vos articles dans une arraylist Utilisation de la carte, vous devrez obtenir la clé, qui correspond à l'élément S'ils n'existent pas encore (c'est la première fois que cet article L'utilisation d'une carte sera également une solution de manière complète, comme il sera également < Strong> O (1) Strong>, au lieu de O (N) Strong> Si un SET <élément> code> au lieu d'une liste
arrayliste <élément> code>. La structure de données code> définir code>
élément code> est un objet personnalisé que vous avez créé, vous devrez remplacer le code> HashCode code> et
est égal à la méthode code> dans votre
élément code> Classe. P>
<élément> code> et itération de l'itération et de la recherche d'un duplicata (qui sera
occurrences h1>
<élément, entier> code>. Cela fera mapper l'article sur le nombre d'événements qu'il y en a. P>
code> 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). P>
< / code> sera inséré dans la carte), ajoutez-le simplement à la carte et définissez la valeur sous forme 1. P>
ArrayList <élément> code> sera utilisé. P>
Exemple: h1>
En supposant que vous puissiez utiliser des flux Java 8, vous pouvez également le faire de cette façon: 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 ()). P> P>
C'est ma solution à l'aide de flux et de fonctions Lambda. J'ai moddifié l'utilisation très cool de < Code> Fusionner Code> a été trouvé dans Cette réponse . Puisque nous ne savons pas ce que occurrence code> pour être un
mappe <élément, entier> code> afin que nous puissions compter par article
item code> i j'ai testé cela à l'aide de
chaîne code> à la place, donc
est égal à code> etc. a fonctionné correctement p> p> P>
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());
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); } }
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> code> où la clé est l'élément et la valeur est la fréquence
Si l'élément
code> est un
pojo code>, quelle est la règle pour déterminer leur égalité?