gpt4 book ai didi

java - 在 Java 中按值排序 HashMap 不起作用

转载 作者:行者123 更新时间:2023-12-02 04:32:54 25 4
gpt4 key购买 nike

我有这个对象:

public class Customer {

private String id;
private String name;
private String cf;
private String pi;
private String telephone;
private String email;
private String website;
private String sector;
private String address;

//constructor and getter, setter method

}

以及客户到主要位置的 map :

Map<String, Customer> customerMap = new HashMap<>();
customerMap.put("1", customer1);
customerMap.put("2", customer2);
...

sortMapByName(customerMap);

我想按名称属性对其进行排序。

我使用此链接中的解决方案:How to sort a Map in Java

代码:

public void sortMapByName(Map<String, Customer> unsortMap) {

// Convert Map to List
List<Map.Entry<String, Customer>> list = new LinkedList<>(unsortMap.entrySet());

// Sort list with comparator, to compare the Map values
Collections.sort(list, new Comparator<Map.Entry<String, Customer>>() {

@Override
public int compare(Map.Entry<String, Customer> o1, Map.Entry<String, Customer> o2) {
return (o1.getValue().getName()).compareTo(o2.getValue().getName());
}
});

// Convert sorted map back to a Map
listCustomer = new LinkedHashMap<>();
for (Map.Entry<String, Customer> entry : list) {
listCustomer.put(entry.getKey(), entry.getValue());
}

}

它不起作用,为什么?

更新

请尝试一下。

Customer.java

public class Customer {

private String id;
private String name;
private String cf;
private String pi;
private String telephone;
private String email;
private String website;
private String sector;
private String address;

public Customer() {
}

public Customer(String id, String name, String cf, String pi, String telephone, String email, String website, String sector, String address) {
this.id = id;
this.name = name;
this.cf = cf;
this.pi = pi;
this.telephone = telephone;
this.email = email;
this.website = website;
this.sector = sector;
this.address = address;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCf() {
return cf;
}

public void setCf(String cf) {
this.cf = cf;
}

public String getPi() {
return pi;
}

public void setPi(String pi) {
this.pi = pi;
}

public String getTelephone() {
return telephone;
}

public void setTelephone(String telephone) {
this.telephone = telephone;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getWebsite() {
return website;
}

public void setWebsite(String website) {
this.website = website;
}

public String getSector() {
return sector;
}

public void setSector(String sector) {
this.sector = sector;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

Main.java

public class Main { 

public static void main(String[] args) {

Map<String, Customer> unsortedMap = new HashMap<>();

Customer one = new Customer("1", "B", "bbb", "1234", "bbb", "gmail.com", "none", "student", "Italy");
Customer two = new Customer("2", "C", "ccc", "1234", "ccc", "gmail.com", "none", "student", "Italy");
Customer three = new Customer("3", "A", "aaa", "1234", "aaa", "gmail.com", "none", "student", "Italy");

unsortedMap.put("1", one);
unsortedMap.put("2", two);
unsortedMap.put("3", three);

System.out.print("Before: \n"+unsortedMap);

Map<String, Customer> sortedMap = sortMapByName(unsortedMap);

System.out.print("\n\nAfter: \n"+sortedMap);
}

public static Map<String, Customer> sortMapByName(Map<String, Customer> unsortMap) {

// Convert Map to List
List<Map.Entry<String, Customer>> list = new LinkedList<>(unsortMap.entrySet());

// Sort list with comparator, to compare the Map values
Collections.sort(list, new Comparator<Map.Entry<String, Customer>>() {

@Override
public int compare(Map.Entry<String, Customer> o1, Map.Entry<String, Customer> o2) {
return (o1.getValue().getName()).compareTo(o2.getValue().getName());
}
});

// Convert sorted map back to a Map
Map<String, Customer> sortedMap = new LinkedHashMap<>();
for (Iterator<Map.Entry<String, Customer>> it = list.iterator(); it.hasNext();) {
Map.Entry<String, Customer> entry = it.next();
sortedMap.put(entry.getKey(), entry.getValue());
}

return sortedMap;

}

}

最佳答案

您需要在方法中使用排序后的映射。将类型从 void 更改为至Map<String, Customer并添加return listCustomer;在最后。原始 map 在当前代码中简单地保留不变。

public Map<String, Customer> sortMapByName(Map<String, Customer> unsortMap) {

...
return listCustomer;
}

如果由于某种原因,listCustomer是类成员,请确保使用它而不是原始的未排序成员。

更新:打印 map 时,您可以循环遍历 map 条目:

for (Iterator<String> iterator = sortedMap.keySet().iterator(); iterator.hasNext();) {
Customer cust = sortedMap.get(iterator.next());
System.out.println(cust);
}

您还需要覆盖 toString() Customer中的方法打印一些有用的东西,例如:

@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", cf=" + cf + ", pi="
+ pi + ", telephone=" + telephone + ", email=" + email
+ ", website=" + website + ", sector=" + sector + ", address="
+ address + "]";
}

关于java - 在 Java 中按值排序 HashMap 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31224864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com