Сортировка объекта коллекции Java на основе одного поля в нем
У меня есть следующая коллекция:
Collection<AgentSummaryDTO> agentDtoList = new ArrayList<AgentSummaryDTO>();
Где AgentSummaryDTO
выглядит следующим образом:
public class AgentSummaryDTO implements Serializable {
private Long id;
private String agentName;
private String agentCode;
private String status;
private Date createdDate;
private Integer customerCount;
}
Теперь мне нужно отсортировать коллекцию agentDtoList
на основе поля customerCount
, как это сделать?
Ответы
Ответ 1
вот мой "1liner":
Collections.sort(agentDtoList, new Comparator<AgentSummaryDTO>(){
public int compare(AgentSummaryDTO o1, AgentSummaryDTO o2){
return o1.getCustomerCount() - o2.getCustomerCount();
}
});
ОБНОВЛЕНИЕ для Java 8: для типа данных int
Collections.sort(agentDtoList, (o1, o2) -> o1.getCustomerCount() - o2.getCustomerCount());
или даже:
Collections.sort(agentDtoList, Comparator.comparing(AgentSummaryDTO::getCustomerCount));
Для типа данных String (как в комментарии)
Collections.sort(list, (o1, o2) -> (o1.getAgentName().compareTo(o2.getAgentName())));
..it ожидает получения AgentSummaryDTO.getCustomerCount()
Ответ 2
Посмотрите Comparator и Collections.
Простым способом было бы реализовать интерфейс Comparable в AgentSummaryDTO
, а затем передать список в Collections.sort()
.
Если вы не можете редактировать AgentSummaryDTO
, вам нужен компаратор, как показано ниже: Как отсортировать список <Object> в алфавитном порядке с использованием поля имени объекта
Ответ 3
ответ Jiri Kremser может быть еще более упрощен, и это действительно полный способ Java 8:
Collections.sort(agentDtoList, Comparator.comparing(AgentSummaryDTO::getCustomerCount));
Это просто сравнивается с целым полем и работает хорошо, так как Integer
реализует Comparable
.
Еще более чистым решением может быть использование встроенного метода comparingInt()
:
Collections.sort(agentDtoList, Comparator.comparingInt(AgentSummaryDTO::getCustomerCount));
Конечно, это можно было бы выразить еще короче, статически импортируя sort
и comparingInt
:
sort(agentDtoList, comparingInt(AgentSummaryDTO::getCustomerCount));
Ответ 4
Посмотрите на код ниже.
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;
}
}
Ответ 5
ОБНОВЛЕНИЕ для Java 8 Работает
Collections.sort(agentDtoList, (o1, o2) -> o1.getCustomerCount() - o2.getCustomerCount());