2017-02-13 7 views
2

これは簡単な質問かもしれませんが、私が得たセットと応答について読むと混乱します。保存された重複レコードを設定する

私はデータベースから重複レコードを取り出し、setを使用して1つの基準(コード)で1つのレコードのみを保存し、残りの重複レコードを無視します。我々は、彼らが重複しても同じ診断コードのレコードが複数回表示されて見ることができるように

Set<DiagnosisInfo> diagnosisInfoSet = patientDiagnosisHistoryRepository 
        .findBydiagnosisdesc(UUID.fromString(patientID.toUpperCase())); 

は、私が得た応答が

"diagnosisInfo": [ 
    { 
     "diagnosisCode": "T49.1X6S", 
     "diagnosisCodeDescription": "Underdosing of antipruritics, sequela" 
    }, 
    { 
     "diagnosisCode": "T49.1X6S", 
     "diagnosisCodeDescription": "Underdosing of antipruritics, sequela" 
    }, 
    { 
     "diagnosisCode": "T49.1X6S", 
     "diagnosisCodeDescription": "Underdosing of antipruritics, sequela" 
    }, 
    { 
     "diagnosisCode": "T49.1X6S", 
     "diagnosisCodeDescription": "Underdosing of antipruritics, sequela" 
    }, 
    { 
     "diagnosisCode": "V09.20", 
     "diagnosisCodeDescription": "Pedestrian injured in traffic accident involving unspecified motor vehicles*" 
    }, 
    { 
     "diagnosisCode": "V09.20", 
     "diagnosisCodeDescription": "Pedestrian injured in traffic accident involving unspecified motor vehicles*" 
    }, 
    { 
     "diagnosisCode": "V09.20", 
     "diagnosisCodeDescription": "Pedestrian injured in traffic accident involving unspecified motor vehicles*" 
    }, 
    { 
     "diagnosisCode": "E09.8", 
     "diagnosisCodeDescription": "Drug or chemical induced diabetes mellitus with unspecified complications" 
    }, 
    { 
     "diagnosisCode": "E09.8", 
     "diagnosisCodeDescription": "Drug or chemical induced diabetes mellitus with unspecified complications" 
    }, 
    { 
     "diagnosisCode": "E09.8", 
     "diagnosisCodeDescription": "Drug or chemical induced diabetes mellitus with unspecified complications" 
    }, 
    { 
     "diagnosisCode": "E09.8", 
     "diagnosisCodeDescription": "Drug or chemical induced diabetes mellitus with unspecified complications" 
    }, 
    { 
     "diagnosisCode": "E09.8", 
     "diagnosisCodeDescription": "Drug or chemical induced diabetes mellitus with unspecified complications" 
    } 
    ] 

ました。私が見たい応答は、以下の通りです。

"diagnosisInfo": [ 
    { 
     "diagnosisCode": "T49.1X6S", 
     "diagnosisCodeDescription": "Underdosing of antipruritics, sequela" 
    }, 
    { 
     "diagnosisCode": "V09.20", 
     "diagnosisCodeDescription": "Pedestrian injured in traffic accident involving unspecified motor vehicles*" 
    }, 
    { 
     "diagnosisCode": "E09.8", 
     "diagnosisCodeDescription": "Drug or chemical induced diabetes mellitus with unspecified complications" 
    } 
    ] 

1つのコードに対して1つの応答。私は私のクエリやセットについて何かを変更する必要があるかどうかはわかりません。

答えて

1

ポイントは次のとおりです。

我々は、彼らが重複しても同じ診断コードのレコードが複数回表示されて見ることができるように。

いいえ、それはではなく、です。あなたのクラスDiagnosisInfoに対して、equals()hashCode()メソッドを実装する必要があります。

2つのオブジェクトが「同じ」であることを確認するために、 Set実装はそれらのオブジェクトによって提供されるequalsメソッドを使用します。ほとんどの場合、クラス内で@Override equals()を忘れたか、あなたはfalseという結果になる実装を提供しました。あなたが「同じである」とみなすオブジェクトであっても。

詳細はhereを参照してください。

あなたの最新のコメントが与えられても、それでもあなたのロジックはまだにあります。です。あなたはまだ、どのオブジェクトが重複しているかを知っていると思います。しかし、あなたが考えるのはではなく、です。重要なのは、equals()メソッド内の実装だけです。その操作の結果は、オブジェクトが等しいか類似しているかどうかを判断します。またはそれらが異なる場合。

So:クラスに新しいフィールドを追加するとき。あなたのIDEを使用してこれらのメソッドを再生成し、今度は結果に "不満"を感じます。あなたの問題は、に含めて、実際には「問題ではない」と考える世代プロセスのフィールドです。コードはと言っています。したがって

、ここ本当のの答え:

  • あなたはバックステップとあなたのオブジェクトモデルを再考する必要があります。 equals/hashCodeメソッドを生成するときに、フィールドを作成/追加したりインクルード(またはインクルード)したりすることはありません。です。いいえ、あなたはにはが必要です。それを正確に実装します。
  • そして:そのようなコードは、ユニットテストとTDDのためにとなるようにです。実際のデータを読むのを待つことはありません。いいえ:があなたのequals実装が期待した結果をもたらすことを確認する様々な単体テストがあります。そして、新しいものを追加したり、コードを変更したりすると、それらのテストを再実行し、壊れたものについてあなたに伝えます。
+0

ご清聴ありがとうございます。 2つのオブジェクトを比較するためにequalsメソッドとhashCodeメソッドをオーバーライドする必要があるという基本を完全に忘れていました。 – arjun

+0

あなたは大歓迎です! – GhostCat

+0

私はhashCodeメソッドとEqualsメソッドをオーバーライドしています。これは昨日重複なしでうまくいきました。今日私はクラスにいくつかのフィールドを追加し、hashCodeメソッドとEqualsメソッドを生成しましたが、それは動作しません。私が紛失しているものは何ですか? Eclipseからこれらのメソッドを生成しています。 – arjun

1

はい、これはDiagnosisInfo doesnのオーバーライドが等しいとき、あなたが得るものですとhaschCode

あなたの設定はどのように確認するには考えていないときに、このオブジェクト

{ 
    "diagnosisCode": "V09.20", 
    "diagnosisCodeDescription": "Pedestrian injured in traffic accident involving unspecified motor vehicles*" 
}, 

この1

{ 
    "diagnosisCode": "V09.20", 
    "diagnosisCodeDescription": "Pedestrian injured in traffic accident involving unspecified motor vehicles*" 
}, 

は同じです...


あなたが HashSet<E>を実装を呼び出している

方法を想定し、spourceコード:

/** 
* Adds the specified element to this set if it is not already present. 
* More formally, adds the specified element <tt>e</tt> to this set if 
* this set contains no element <tt>e2</tt> such that 
* <tt>(e==null&nbsp;?&nbsp;e2==null&nbsp;:&nbsp;e.equals(e2))</tt>. 
* If this set already contains the element, the call leaves the set 
* unchanged and returns <tt>false</tt>. 
* 
* @param e element to be added to this set 
* @return <tt>true</tt> if this set did not already contain the specified 
* element 
*/ 
public boolean add(E e) { 
    return map.put(e, PRESENT)==null; 
} 

がmap.putがputVal

を呼び出し、putvalはヘクタール...イコールとハッシュコードを使用しています!

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, 
       boolean evict) { 
    Node<K,V>[] tab; Node<K,V> p; int n, i; 
    if ((tab = table) == null || (n = tab.length) == 0) 
     n = (tab = resize()).length; 
    if ((p = tab[i = (n - 1) & hash]) == null) 
     tab[i] = newNode(hash, key, value, null); 
    else { 
     Node<K,V> e; K k; 
     if (p.hash == hash && 
      ((k = p.key) == key || (key != null && key.equals(k)))) 
      e = p; 
     else if (p instanceof TreeNode) 
      e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); 
     else { 
      for (int binCount = 0; ; ++binCount) { 
       if ((e = p.next) == null) { 
        p.next = newNode(hash, key, value, null); 
        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st 
         treeifyBin(tab, hash); 
        break; 
       } 
       if (e.hash == hash && 
        ((k = e.key) == key || (key != null && key.equals(k)))) 
        break; 
       p = e; 
      } 
     } 
     if (e != null) { // existing mapping for key 
      V oldValue = e.value; 
      if (!onlyIfAbsent || oldValue == null) 
       e.value = value; 
      afterNodeAccess(e); 
      return oldValue; 
     } 
    } 
    ++modCount; 
    if (++size > threshold) 
     resize(); 
    afterNodeInsertion(evict); 
    return null; 
} 
+0

ありがとうございました。あなたの提案されたコードは、私にとって理解するのが難しいようです。私はすごく新しいです。 – arjun

+0

あなたも大歓迎です、これはあまりにも学習のためのサイトです:) –

関連する問題