所以我的问题是我不想在对象列表中重复名称。
所以我尝试将list
转换为hashset
,但它仍然包含同名的行。
基本上我只想获得1行Flow2和另一行TestFlow NOT 4. http://prntscr.com/hylkoc
public static Set<TestFlow> getFlows() {
SessionFactory factory = HibernateUtil.GetSessionFactory();
Session hibernateSession = factory.openSession();
Transaction tx = null;
List<TestFlow> testFlows;
Set<TestFlow> testFlowSet = new HashSet<>();
try {
tx = hibernateSession.beginTransaction();
testFlows = hibernateSession.createQuery("FROM TestFlow").list();
testFlowSet = new HashSet<>(testFlows);
tx.commit();
} catch (HibernateException e) {
if (tx != null) tx.rollback();
e.printStackTrace();
} finally {
hibernateSession.close();
}
return testFlowSet;
}
答案 0 :(得分:1)
TestFlow是一个对象,因此具有相同名称的记录并不意味着它等于另一个对象。
您可以改为使用地图:
Map<String, TestFlow>
密钥将是名称,值将是TestFlow记录。这样,如果名称存在,则不会将记录添加到地图中。
另一个选项是覆盖equals方法,尽管如果你在其他地方使用该对象并且它有一堆字段,那可能不是一个好主意。
答案 1 :(得分:0)
您可以使用TreeSet + Comparator:
<强>比较强>
public class TestFlowComparator implements Comparator<TestFlow> {
@Override
public int compare(TestFlow o1, TestFlow o2) {
return o1.getName().compareTo(o2.getName());
}
}
测试:
@Test
@DisplayName("stack")
public void srack(){
List<TestFlow> listTestFlow = new ArrayList<>();
listTestFlow.add(new TestFlow("a"));
listTestFlow.add(new TestFlow("a"));
listTestFlow.add(new TestFlow("a"));
listTestFlow.add(new TestFlow("a"));
listTestFlow.add(new TestFlow("ъ"));
listTestFlow.add(new TestFlow("ъ"));
Set<TestFlow> set = new TreeSet<>(new TestFlowComparator());
set.addAll(listTestFlow);
System.out.println(set.toString());
}
sout :[TestFlow {name = a},TestFlow {name =ъ}]
答案 2 :(得分:0)
内部TestFlow
类会覆盖两个方法equals()
和hashCode()
。
例如,如果TestFlow
类具有int id
属性,则可以执行此操作:
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof TestFlow) {
TestFlow tf = (TestFlow) obj;
return tf.id == this.id;
}
return false;
}