2015-07-04 4 views
0

У меня есть этот объект:HashMap Сортировать по значению в 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; 

    //constructor and getter, setter method 

} 

и Карту Клиента в основной:

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()); 
    } 

} 

это не работает, почему?

UPDATE

Пожалуйста, попробуйте.

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; 

} 

} 
+0

Что не работает? – sstan

+0

Hash map хранит значения, где ключ - это значение хеш-объекта. См. Http://stackoverflow.com/questions/21974361/what-java-collection-should-i-use Использовать TreeMap –

+0

@RobertWadowski, вы не читали его код. Он принимает в HashMap, но он помещает значения в LinkedHashMap, который сохраняет порядок вставки при повторении. – Dogs

ответ

2

Вы должны использовать отсортированный карту в методе. Измените тип от void до Map<String, Customer и добавьте return listCustomer; в конец. Исходная карта просто сохраняется без изменений в вашем текущем коде.

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

    ... 
    return listCustomer; 
} 

Если по какой-то причине, listCustomer является членом класса, убедитесь, что вы используете, что вместо оригинального несортированных один.

UPDATE: При печати карты, вы можете цикл над элементами карты:

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 + "]"; 
} 
+1

Он должен делать то, что вы говорите. Но он присваивает свои результаты 'listCustomer', который, как представляется, определяется вне метода сортировки. Так может быть, это специально? Так может быть, его проблема - это что-то еще? – sstan

+0

У меня есть вопрос, пожалуйста, попробуйте код. Обновление: работает! – Dave

+1

@DavideFruci Он отлично работает. Вы просто не распечатываете карту, чтобы показать поле «имя». См. Мое обновление. – manouti

Смежные вопросы