2017-03-21 4 views
0

J'ai un ensemble et je veux le convertir en carte afin de l'utiliser plus tard dans Maps.difference() de la goyave. Je me soucie seulement des clés de la différence.
venu avec cette version:comment convertir un ensemble à la carte

private <T> Map<T, T> toMap(Set<T> set) { 
    return set.stream().collect(Collectors.toMap(Function.identity(), Function.identity())); 
} 

Cependant, je sais que généralement, un ensemble a un champ de support de carte. Ceci est la méthode que je l'utilise pour créer la carte:

public static <E> Set<E> newConcurrentHashSet() { 
    return Collections.newSetFromMap(new ConcurrentHashMap<E, Boolean>()); 
} 

Depuis que je ne dois les clés que je pensais que je peux obtenir une vue de ce champ en quelque sorte. une idée?

+2

pourquoi ne pas utiliser https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Sets.html#difference-java.util .Set-java.util.Set-? Pourquoi essayez-vous de forcer un ensemble dans une carte? – luk2302

+0

Je voudrais savoir quels éléments seulement sur la gauche, qui seulement sur la droite, ce qui en commun (similaire à la différence de carte) – oshai

+1

Si vous avez seulement besoin des clés, pourquoi convertissez-vous en carte? Une carte est fondamentalement un ensemble avec des valeurs, donc ce que vous dites n'a aucun sens. – Andreas

Répondre

2

Vous pouvez convertir un Set à un Map (même clé et la valeur prise des éléments de Set) comme indiqué ci-dessous:

private <T> Map<T, T> toMap(Set<T> set) { 
    Map<T, T> map = new ConcurrentHashMap<>(); 
    set.forEach(t -> map.put(t, t));//contains same key and value pair 
    return map; 
} 
0

Voir la réponse similaire here.

En supposant que votre jeu d'origine est un ensemble de valeurs (pas de clés dans les données d'origine!), Vous devrez spécifier des clés pour la carte nouvellement créée. Le Maps.uniqueIndex de Guava peut être utile (voir here)

Sinon, si votre jeu d'origine est un ensemble de clés (aucune valeur dans les données d'origine!) Que vous souhaitez conserver, vous devrez spécifier des valeurs par défaut ou spécifiques pour le nouveau carte créée. Le Maps.toMap de Guava pourrait être utile ici. (Voir plus here)

1

De comment:

Je voudrais savoir quels sont les éléments que sur la gauche, qui ne le droit qui en commun (semblable à la carte différence)

Utilisation removeAll() et [retainAll()][3].

Exemple:

Set<Integer> set1 = new HashSet<>(Arrays.asList(1,3,5,7,9)); 
Set<Integer> set2 = new HashSet<>(Arrays.asList(3,4,5,6,7)); 

Set<Integer> onlyIn1 = new HashSet<>(set1); 
onlyIn1.removeAll(set2); 

Set<Integer> onlyIn2 = new HashSet<>(set2); 
onlyIn2.removeAll(set1); 

Set<Integer> inBoth = new HashSet<>(set1); 
inBoth.retainAll(set2); 

System.out.println("set1: " + set1); 
System.out.println("set2: " + set2); 
System.out.println("onlyIn1: " + onlyIn1); 
System.out.println("onlyIn2: " + onlyIn2); 
System.out.println("inBoth : " + inBoth); 

Sortie

set1: [1, 3, 5, 7, 9] 
set2: [3, 4, 5, 6, 7] 
onlyIn1: [1, 9] 
onlyIn2: [4, 6] 
inBoth : [3, 5, 7] 

Maintenant, si vous voulez connaître toutes les valeurs et, vous pouvez le faire (Java 8) où ils ont été trouvés:

Set<Integer> setA = new HashSet<>(Arrays.asList(1,3,5,7,9)); 
Set<Integer> setB = new HashSet<>(Arrays.asList(3,4,5,6,7)); 

Map<Integer, String> map = new HashMap<>(); 
for (Integer i : setA) 
    map.put(i, "In A"); 
for (Integer i : setB) 
    map.compute(i, (k, v) -> (v == null ? "In B" : "In Both")); 

System.out.println("setA: " + setA); 
System.out.println("setB: " + setB); 
map.entrySet().stream().forEach(System.out::println); 

Sortie

setA: [1, 3, 5, 7, 9] 
setB: [3, 4, 5, 6, 7] 
1=In A 
3=In Both 
4=In B 
5=In Both 
6=In B 
7=In Both 
9=In A