我正在创建一个Hashmap对象,其键为Employee名称,值为Employee对象,其属性为name,id和age。如何按哈希值对具有员工ID的值进行排序?
答案 0 :(得分:2)
您可以创建一个TreeMap
而不是Hashmap
。
将“雇员ID”作为键输入到TreeMap中,并将“雇员”对象作为值。(因为您要根据到员工ID,并且员工ID在您的上下文中似乎是唯一的。)
TreeMap<Integer, EmpObj> map = new TreeMap<>();
如果您无法更改地图ID,则可以按值对哈希图进行排序。 请参阅this link。
答案 1 :(得分: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
*/
}
}
答案 2 :(得分:0)
HashMaps
是无序的。将密钥设置为Id
。地图将如下所示,
Map<Integer, EmployeeDTO> map = new HashMap<>();
您可以根据以下键对地图进行排序,
SortedMap<Integer, EmployeeDTO> sortedMap = new TreeMap<Integer, EmployeeDTO>(map);
如果您确实需要将名称保留为键并按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;
}
}
答案 3 :(得分:-1)
Hashmap
不能排序。有一个接口SortedMap
及其实现之一-TreeMap
,但是它对键而不是值进行排序。因此,您的结果图将按员工姓名排序。
另一方面,您可以使用LinkedHashMap
并根据规则插入新值,但是我认为这不是您真正想要的。