J'ai la collection suivante:
Collection<AgentSummaryDTO> agentDtoList = new ArrayList<AgentSummaryDTO>();
Où AgentSummaryDTO
ressemble à ceci:
public class AgentSummaryDTO implements Serializable {
private Long id;
private String agentName;
private String agentCode;
private String status;
private Date createdDate;
private Integer customerCount;
}
Maintenant, je dois trier la collection agentDtoList
en fonction du champ customerCount
, comment y parvenir?
voici mon "1liner":
Collections.sort(agentDtoList, new Comparator<AgentSummaryDTO>(){
public int compare(AgentSummaryDTO o1, AgentSummaryDTO o2){
return o1.getCustomerCount() - o2.getCustomerCount();
}
});
MISE À JOUR pour Java 8: pour le type de données int
Collections.sort(agentDtoList, (o1, o2) -> o1.getCustomerCount() - o2.getCustomerCount());
ou même:
Collections.sort(agentDtoList, Comparator.comparing(AgentSummaryDTO::getCustomerCount));
Pour le type de données String (comme dans le commentaire)
Collections.sort(list, (o1, o2) -> (o1.getAgentName().compareTo(o2.getAgentName())));
..il attend getter AgentSummaryDTO.getCustomerCount()
Jetez un œil aux classes Comparateur et Collections .
Un moyen simple serait d'implémenter l'interface Comparable dans AgentSummaryDTO
puis de passer la liste à Collections.sort()
.
Si vous ne pouvez pas modifier AgentSummaryDTO
, vous avez besoin d'un comparateur comme indiqué ici: Comment trier une liste <Objet> par ordre alphabétique à l'aide du champ Nom de l'objet
Le réponse de Jiri Kremser peut être simplifié encore plus, ce qui est vraiment la manière complète Java 8 de le faire:
Collections.sort(agentDtoList, Comparator.comparing(AgentSummaryDTO::getCustomerCount));
Cela se compare simplement par le champ entier et fonctionne bien puisque Integer
implémente Comparable
.
Une solution encore plus propre pourrait être d'utiliser la méthode intégrée comparingInt()
:
Collections.sort(agentDtoList, Comparator.comparingInt(AgentSummaryDTO::getCustomerCount));
Bien sûr, cela pourrait être exprimé encore plus rapidement en important statiquement sort
et comparingInt
:
sort(agentDtoList, comparingInt(AgentSummaryDTO::getCustomerCount));
Jetez un œil au code ci-dessous.
package test;
import Java.io.Serializable;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Date;
import Java.util.List;
public class AgentSummary {
private Long id;
private String agentName;
private String agentCode;
private String status;
private Date createdDate;
private Integer customerCount;
/**
* @param args
*/
public static void main(String[] args) {
new AgentSummary().addObjects();
}
public void addObjects(){
List<AgentSummaryDTO> agentSummary = new ArrayList<AgentSummaryDTO>();
for (int j = 0; j < 10; j++) {
agentSummary.add(new AgentSummaryDTO(j));
}
Collections.sort(agentSummary);
for (AgentSummaryDTO obj : agentSummary) {
System.out.println("File " + obj.getCustomerCount());
}
}
}
class AgentSummaryDTO implements Serializable, Comparable<AgentSummaryDTO> {
private Long id;
private String agentName;
private String agentCode;
private String status;
private Date createdDate;
private Integer customerCount;
AgentSummaryDTO() {
customerCount = null;
}
AgentSummaryDTO(int customerCount) {
this.customerCount = customerCount;
}
/**
* @return the id
*/
public Long getId() {
return id;
}
/**
* @param id
* the id to set
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return the agentName
*/
public String getAgentName() {
return agentName;
}
/**
* @param agentName
* the agentName to set
*/
public void setAgentName(String agentName) {
this.agentName = agentName;
}
/**
* @return the agentCode
*/
public String getAgentCode() {
return agentCode;
}
/**
* @param agentCode
* the agentCode to set
*/
public void setAgentCode(String agentCode) {
this.agentCode = agentCode;
}
/**
* @return the status
*/
public String getStatus() {
return status;
}
/**
* @param status
* the status to set
*/
public void setStatus(String status) {
this.status = status;
}
/**
* @return the createdDate
*/
public Date getCreatedDate() {
return createdDate;
}
/**
* @param createdDate
* the createdDate to set
*/
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
/**
* @return the customerCount
*/
public Integer getCustomerCount() {
return customerCount;
}
/**
* @param customerCount
* the customerCount to set
*/
public void setCustomerCount(Integer customerCount) {
this.customerCount = customerCount;
}
@Override
public int compareTo(AgentSummaryDTO arg0) {
if (this.customerCount > arg0.customerCount)
return 0;
else
return 1;
}
}
MISE À JOUR pour Java 8 C'est du travail
Collections.sort(agentDtoList, (o1, o2) -> o1.getCustomerCount() - o2.getCustomerCount());