我是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顺序显示
或保留代码,因为它是
我只想澄清,
谢谢
答案 0 :(得分:3)
您可以使用其中任何一种,但需要考虑的事项:
- 设置虽然提供了唯一的数据,但也有成本。
- 如果您确定该表具有组织的唯一名称,那么您应该选择列表。
醇>
看起来你正在使用Spring和JPA,如果是这种情况,那么你可以使用SORT接口(org.springframework.data.domain.Sort)来获取排序数据。
答案 1 :(得分:2)
我的问题是,我可以使用Set而不是List
是的,没有问题,只需实施方法equals
和hashCode
。
如果使用Set,我可以使用TreeSet,因为我需要以id的asc顺序显示
如果类EntityDetail
实现接口Comparable<EntityDetail>
,则可以。这是必要的,因为TreeSet
必须知道各种EntityDetail
对象的自然顺序是什么。
有关详细信息,请参阅Oracle docs on object ordering和Javadoc 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;
}
}