列表到Hashset

时间:2018-01-10 16:53:41

标签: java hibernate hashset

所以我的问题是我不想在对象列表中重复名称。

所以我尝试将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;
}

3 个答案:

答案 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;
}