【发布时间】:2018-12-22 05:39:32
【问题描述】:
我正在创建一个 Hashmap 对象,其键为员工姓名,值作为员工对象,其属性为姓名、ID 和年龄。如何使用员工 id 按值对 hashmap 进行排序?
【问题讨论】:
标签: java
我正在创建一个 Hashmap 对象,其键为员工姓名,值作为员工对象,其属性为姓名、ID 和年龄。如何使用员工 id 按值对 hashmap 进行排序?
【问题讨论】:
标签: java
您可以创建一个TreeMap 而不是Hashmap。
将员工 id 作为 TreeMap 中的键,将员工对象作为值。(因为您想根据员工 id 进行排序,而员工 id 对于您的上下文来说似乎是唯一的。)
TreeMap<Integer, EmpObj> map = new TreeMap<>();
如果不能改变map id,可以按值对hashmap进行排序。 参考this link。
【讨论】:
Hashmap 不是为排序而设计的。有一个接口 SortedMap 及其实现之一 - TreeMap,但它对 keys 进行排序,而不是对值进行排序。因此,您的结果图将按员工姓名排序。
另一方面,您可以使用LinkedHashMap 并根据您的规则插入新值,但我认为这不是您真正想要的。
【讨论】:
HashMaps 是无序的。将您的密钥设为Id。地图如下,
Map<Integer, EmployeeDTO> map = new HashMap<>();
您可以按如下方式对地图进行排序,
SortedMap<Integer, EmployeeDTO> sortedMap = new TreeMap<Integer, EmployeeDTO>(map);
如果你确实需要保持name作为key并按Id排序,如果你使用的是java 8,可以使用以下方式,
Stream<Map.Entry<K,V>> sorted =
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue(comparator));
您可以创建的比较器,
public class EmployeeComparator implements Comparator<EmployeeDTO>{
@Override
public int compare(EmployeeDTO employeeDTO1, EmployeeDTO employeeDTO2) {
try {
if(employeeDTO1!=null && employeeDTO2!=null &&
employeeDTO1.getId()!=null && employeeDTO2.getId()!=null){
try {
return Integer.parseInt(employeeDTO1.getId()) - Integer.parseInt(employeeDTO2.getId());
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
【讨论】:
是的,您可以按键排序。像其他人建议的那样,您可以使用 TreeMap 来保持您的键排序。
例如,此代码将保持所有元素按其键排序:
import java.util.Map;
import java.util.TreeMap;
public class Stack {
public static void main(String args[]){
TreeMap<Integer, String> map = new TreeMap<>();
map.put(10,"Daniel");
map.put(4,"Peter");
map.put(1,"Claudia");
for(Map.Entry<Integer,String> entry : map.entrySet()){
System.out.println(entry.getKey() +" -> "+entry.getValue());
}
/* it will print to console:
1 -> Claudia
4 -> Peter
10 -> Daniel
*/
}
}
【讨论】: