タイトル通りこのようなソースを書くと Setで重複値が削除されなかった(;´Д`)
public class TestBean { /** NO */ private Long no; /** 名前 */ private String name; // ゲッターセッター省略 } private void testHogeHoge() { Set<TestBean> set = new HashSet<>(); TestBean bean = new TestBean(); bean.setNo(1L); bean.setName("ほげ"); set.add(bean); bean = new TestBean(); bean.setNo(1L); bean.setName("ほげ"); set.add(bean); bean = new TestBean(); bean.setNo(2L); bean.setName("ふが"); set.add(bean); System.out.println(set.size()); }
これだと2と出して欲しいのに3が出てきやがった(;´Д`)
色々試したらTestBeanにhashCode()とequals()メソッドを作成したら重複値がちゃんと削除されます(´・ω・`)
hashCode()とequals()はeclipseで簡単に作成できます。
右クリックメニュー → ソース → hashCode()およびequals()の生成
これで作成すると
public class TestBean { /** NO */ private Long no; /** 名前 */ private String name; // ゲッターセッター省略 /* (非 Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } /* (非 Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; TestBean other = (TestBean) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } private void testHogeHoge() { Set<TestBean> set = new HashSet<>(); TestBean bean = new TestBean(); bean.setNo(1L); bean.setName("ほげ"); set.add(bean); bean = new TestBean(); bean.setNo(1L); bean.setName("ほげ"); set.add(bean); bean = new TestBean(); bean.setNo(2L); bean.setName("ふが"); set.add(bean); System.out.println(set.size()); }
これで2がでてきます(´・ω・`)
できましたかなブラック企業の皆様(´・ω・`)
Eclipseの自動生成でも全く問題はないのですが、
返信削除Java7からだとObjects.hash()というメソッドが追加されています。
http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html#hash(java.lang.Object...)
参考になります!
削除それについても記事を書いてみますね。