在代码中使用set或List

时间:2016-12-26 09:40:17

标签: java spring-mvc

我是java的新手,我有一个场景,我需要从表中列出组织类型:

要求:只需列出,不添加或删除元素,

据我了解set和list之间的区别:

设置

Set是唯一的对象集合。 Set是无序的对象集合。

列表:

列表是对象的非唯一集合。 列表是对象的有序集合。

在我的表中,我有以下列:

id name      is_active
1  Lab        1
2  Pharmacy   2
3  Hospital   3 

最多10行

**Controller**:

List<OrgType> orgTypeList = organizationService.getAllOrgTypes(true);
OrgTypeResponse response = new OrgTypeResponse();
List<EntityDetail> orgTypeDetailList = new ArrayList<>();
EntityDetail orgTypeDetail;
for(OrgType orgType : orgTypeList) {
    orgTypeDetail = new EntityDetail();
    orgTypeDetail.setId(orgType.getId());
    orgTypeDetail.setName(orgType.getName());
    orgTypeDetailList.add(orgTypeDetail);
}
response.setStatus(ResponseStatusCode.SUCCESS);
response.setTotalOrgTypes((long)orgTypeDetailList.size());
response.setOrgTypes(orgTypeDetailList);
return response;


**Service** Implementaion:
List<OrgType> orgTypeList = orgTypeRepository.findByActive(active);
return orgTypeList;

这是我的EntityDetail类:

public class EntityDetail {

    private Long id;
    private String name;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

我的问题是,我可以使用Set而不是List

如果使用Set,我可以使用TreeSet,因为我需要以id的asc顺序显示

或保留代码,因为它是

我只想澄清,

谢谢

5 个答案:

答案 0 :(得分:3)

您可以使用其中任何一种,但需要考虑的事项:

  
      
  1. 设置虽然提供了唯一的数据,但也有成本。
  2.   
  3. 如果您确定该表具有组织的唯一名称,那么您应该选择列表。
  4.   

看起来你正在使用Spring和JPA,如果是这种情况,那么你可以使用SORT接口(org.springframework.data.domain.Sort)来获取排序数据。

答案 1 :(得分:2)

  

我的问题是,我可以使用Set而不是List

是的,没有问题,只需实施方法equalshashCode

  

如果使用Set,我可以使用TreeSet,因为我需要以id的asc顺序显示

如果类EntityDetail实现接口Comparable<EntityDetail>,则可以。这是必要的,因为TreeSet必须知道各种EntityDetail对象的自然顺序是什么。

有关详细信息,请参阅Oracle docs on object orderingJavadoc for Comparable

答案 2 :(得分:0)

是的,在这种情况下你可以使用SET代替List,因为SET将确保消除重复的条目。但是使用SET确保你已经覆盖了#34; equals&#34;和&#34;哈希码&#34;适当。

答案 3 :(得分:0)

如果您可以在代码中确保按照您想要的顺序添加详细信息,则可以使用List。如果您不确定添加的顺序,则可以使用Collections.sort方法。为此,您还需要使OrgType implement Comparable界面提供订购OrgType对象的策略。在你的情况下,它是由id。

如果您使用TreeSet,则无论何时插入集合都会自动完成排序,从而无需使用Collections.sort,但您仍需提供排序策略。

查看this

使用Set会有成本因为它维护了唯一的元素,但是因为你最多有10行不会成为问题。

答案 4 :(得分:0)

这是你需要覆盖equals和hashcode方法的方法,为了排序,你需要实现Comparable并实现compareTo方法,如下所示:

class EntityDetail implements Comparable<EntityDetail>{
@Override
public int hashcode(){
    int result = 17;
    result = 31 * result + name.hashCode();
    result = 31 * result + id;
    return result;
}

@Override
public boolean equals(Object o){
    if (o == this) return true;
    if (!(o instanceof EntityDetail)) {
        return false;
    }

    EntityDetail ed = (EntityDetail) o;

    return ed.name.equals(name) &&
            ed.id == id ;

}

@Override
public int compareTo(EntityDetail ed) {
    int compareId = ((EntityDetail) ed).getId();

    //ascending order
    return this.id - compareId;

    //descending order
    //return compareId - this.id;
}
}