2017-03-23 6 views
-1

J'essaie de créer tous les sous-ensembles d'un ensemble et de les regrouper sans doublons. Par exemple, dans un ensemble comme {1,2,3,4,5,6}, {(1,2), (3,4), (5,6)} ce tuple peut être valide d'un autre côté { (1,2), (2,4), (5,6)} ce tuple ne devrait pas être valide puisqu'il a deux instances du numéro 2 bien que l'ensemble n'ait qu'une instance du numéro 2.Comment forcer eclipse à créer différentes références d'objet

ce formulaire non-dupliqué, j'ai une petite méthode qui vérifie le sous-ensemble donné, si elle a le nombre qui est passé à la méthode en tant que paramètre, il renvoie vrai.

Le problème avec cela, quand il y a un doublon dans l'ensemble comme {1,2,3,1,5,6} il ne devrait pas dire que le second "1" est égal au premier "1". Pour que cela se produise, j'ai utilisé l'opérateur "==" pour comparer les références d'objets et j'ai espéré que cela fera la différence entre le premier "1" et le second "1", mais ce n'est pas le cas. Apparemment, Eclipse crée la même référence d'objet pour le même type d'objets qui est créé à la compilation et a la même valeur. Comment puis-je forcer Eclipse à créer différentes références d'objet? S'il existe un moyen de marquer des objets avec un numéro unique, cela aide aussi.

Voici la méthode:

private boolean doesTuplesHave(Integer number, ArrayList<ArrayList<Integer>> tuples){ 

    for(ArrayList<Integer> list : tuples){ 
     for(Integer numinTuple : list){ 
      if(numinTuple == number){ 
       return true; 
      } 
     } 
    } 

    return false; 
} 
+0

Eclipse est le développement environnement; ce n'est pas le compilateur ('javac') ou le runtime (' jre', 'java') - c'est la machine virtuelle Java qui crée les instances de' Integer'. Je peux forcer votre for-loop 'pour (Integer numinTuple: list)' pour créer de nouvelles instances séparées de 'Integer', mais alors numinTuple aura _never_ be' == 'en nombre. –

+0

A côté de la réponse ci-dessous, vous m'avez compris, merci. Pour exécuter et tester la méthode 'doTuplesHav' j'ai créé 6 objet' Integer' et les ajouter à 2 'ArrayList' en les regroupant par 3 pour imiter le paramètre' tuples'. Dans le débogage, j'ai vu que tous les entiers dans les tuples devenaient égaux à 'number' indépendamment de leurs valeurs. Heureusement, j'ai changé la conception de sorte que je n'ai plus besoin de contrôle de référence. –

Répondre

2

a) Eclipse n'a rien à voir avec elle, ce comportement est standard pour tous les compilateurs Java et JVMs.

b) utiliser (.equals)

if(numinTuple.equals(number)) 

ou, s'il est possible que l'un des côtés peut être nulle, utiliser Objects.equals():

if(Objects.equals(numinTuple, number)) 

Explication : en Java, l'opérateur == vérifie l'égalité de référence, pas l'égalité sémantique (ie est-ce le même objet que ces objets ont-ils la même valeur)

Voir: What is the difference between == vs equals() in Java?


En outre, en Java 8, votre méthode peut être réécrite d'une manière plus concise:

return tuples.stream().anyMatch(l->l.contains(number)); 

(qui fixe également votre bug)

+0

Vous vous êtes trompé. Je veux vérifier les références entre les objets et non leurs valeurs. Je ne veux pas le même objet dans un tuple. Avec un ensemble comme celui-ci {1,2,3,4} (1,1) connot être valide mais dans un ensemble comme {1,2,3,1}, (1,1) tuple est valide. Avec la valeur de contrôle des objets, vous ne pouvez pas avoir (1,1) tuple lorsque l'ensemble donné est {1,2,3,1}. Le problème est venu de cette situation. Je veux vérifier si c'est le même objet. Mais la référence de tous les objets ayant la même valeur est la même, il est donc impossible de vérifier l'égalité de référence. –