代碼

2016-12-26 35 views
0

我是新手到Java中使用集或列表在這裏,我有一種情況,在那裏我需要從表中列出的組織類型:代碼

要求:剛上市,無添加或刪除的元素,

按照我的理解,並集列表之間的區別:

集是對象的獨特收藏。 設置是無序的對象集合。

列表:

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

在我的表我有樣柱:

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

如果使用設置,我可以使用TreeSet的,因爲我需要在ID

的ASC爲了顯示或離開的代碼,因爲它是

我只是想澄清,

謝謝

+0

您可以使用設置或列出這取決於需求。只有差異列表使用set纔會刪除重複項。對於相同數量的元素,HashSet比ArrayList消耗的內存大約多5.5倍(儘管它們仍然是線性的)。 如果您不關心包含的唯一性或性能,那麼使用ArrayList –

回答

2

這裏我的問題是,我可以使用Set,而不是名單

是的,沒有問題,只是imple方法equalshashCode

如果集時,我可以用TreeSet的,因爲我需要在ID

你可以,如果類EntityDetail實現接口Comparable<EntityDetail>的ASC爲了展現。這是必要的,因爲TreeSet必須知道各種EntityDetail對象的自然順序。

有關詳細信息,請參閱Oracle docs on object orderingJavadoc for Comparable

+0

「如果類EntityDetail實現了接口Comparable ,則可以。不一定是因爲'TreeSet'具有一個帶有'Comparator'作爲參數的重載構造函數。 – davidxxx

+1

@davidxxx謝謝,很好的接收!如果它支持元素排序(通過實現Comparable'''),我通常更喜歡該類明確表示,所以我忘記了那個重載的構造函數。 –

0

是u可以使用SET而不是List在這種情況下,因爲SET將確保重複的條目被淘汰。但是使用SET確保你已經適當地重寫了「equals」和「hashcode」。

3

你可以使用任何他們,但事情被關在考慮:

  1. 組雖然提供了獨特的數據,但也有代價。
  2. 如果您確定該表具有唯一的組織名稱,那麼您應該選擇列表。

好像你正在使用Spring與JPA,如果是這樣的話,那麼你可以使用SORT接口(org.springframework.data.domain.Sort)來獲取排序的數據。

+0

默認情況下,其僅顯示升序 – javailike

+0

yes默認順序是升序,但您可以指定它也是desc。您可以將SORT.DIRECTION作爲ASC或DESC傳遞參考文檔http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Sort.html http:/ /docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Sort.Direction.html –

0

如果您可以確保在您的代碼中按照所需順序添加了詳細信息,則可以使用List。如果您不確定添加的順序,那麼您可以使用Collections.sort方法。爲此,您還需要使您的接口 implementComparable提供策略來訂購OrgType對象。在你的情況下,它是由編號。

如果您使用TreeSet,則只要您插入到集合中就自動完成排序,從而消除使用Collections.sort,但您仍然必須提供排序策略。

看一看this

有使用一組的成​​本,因爲它保持獨特的元素,而是因爲你有一個最大的10行,這將不會是一個問題。

0

這就是你需要重寫equals和hashCode方法和排序目的,你需要按以下方式實現可比性,實現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; 
} 
} 
+0

謝謝,這是我正在尋找的 – javailike

+0

@javalike在這種情況下,你應該接受答案。 – KayV

+0

但是,上面的代碼讓我眨眼,只是列出了行,我需要使用這個非常複雜的行爲 – javailike