2017-03-23 3 views
-1

私はセットのすべてのサブセットを作成し、それらを重複なくグループ化しようとしています。例えば、{1,2,3,4,5,6}、{(1,2)、(3,4)、(5,6)}のような集合では、このタプルは、 (1,2)、(2,4)、(5,6)}このタプルは、2のインスタンスが2つしかないので有効ではありません。別のオブジェクト参照を作成するためにeclipseを強制する方法

この重複しないフォームは、私は与えられたサブセットをチェックする小さなメソッドを持っている場合は、パラメータとしてメソッドに渡される番号があれば、それはtrueを返します。

{1,2,3,1,5,6}のようなセットに重複がある場合、2番目の "1"が最初の "1"と等しいとは限りません。これを実現するために、私はオブジェクト参照を比較するために "=="演算子を使用しました。これは最初の "1"と2番目の "1"の間に差が生じることを期待しましたが、そうではありませんでした。明らかに、Eclipseはコンパイル時に作成され同じ値を持つ同じタイプのオブジェクトに対して同じオブジェクト参照を作成します。 Eclipseに強制的に異なるオブジェクト参照を作成させるにはどうすればよいですか?一意の番号を持つオブジェクトにフラグを立てる方法がある場合は、それも役立ちます。ここで

はメソッドです:

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は、開発であります環境;コンパイラ( 'javac')やランタイム(' jre'、 'java')ではなく、' Integer'のインスタンスを生成するJava仮想マシンです。私はあなたのforループ 'for(Integer numinTuple:list)'を強制して、 'Integer'の新しいインスタンスを作成することができます。しかし、numinTupleはnumberに' == 'になりません。 –

+0

以下の回答のほかに、私を理解してくれた、ありがとう。 'doesTuplesHav'メソッドを実行してテストするために、私は6つの' Integer'オブジェクトを作成し、 'tuples'パラメータを模倣するためにそれらを3でグループ化して2つの' ArrayList'に追加しました。デバッグでは、値にかかわらず、タプル内のすべての整数が '数値 'に等しくなることがわかりました。うまくいけば、私はもうリファレンスコントロールが必要ないようにデザインを変更しました。 –

答えて

2

a)のEclipseはそれとは何の関係もありません、これはすべてのJavaコンパイラとJVMの標準的な動作です。それは側面の一方はヌルであり得ることが可能かどう

b)は、.equals()

if(numinTuple.equals(number)) 

を使用するか、)Objects.equalsを(使用:

if(Objects.equals(numinTuple, number)) 

説明:Javaでは、==演算子は意味均等性ではなく、参照平等をチェックします(つまり、同じオブジェクトと同じオブジェクトと同じ値です)。

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


はまた、Javaの8で、あなたの方法のように、より簡潔な方法で書き換えることができます。

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

(またあなたのバグを修正した)

+0

あなたは私が間違っています。私はそれらの値ではなくオブジェクト間の参照をチェックしたいと思います。私はタプル内に同じオブジェクトを必要としません。この{1,2,3,4}(1,1)のようなセットは有効ですが、{1,2,3,1}のようなセットでは(1,1)タプルは有効です。与えられた集合が{1,2,3,1}のとき、オブジェクトの値を制御することで、(1,1)タプルを持つことはできません。この問題はこの状況から生じました。私はそれが同じオブジェクトであるかどうかをチェックしたい。しかし、同じ値を持つすべてのオブジェクトの参照は同じであるため、参照の平等をチェックすることは不可能です。 –

関連する問題