Как вы сортируете числовые значения, хранящиеся в hashmap, а затем в ArrayList в Java?

#java #android

#java #Android

Вопрос:

У меня есть ArrayList .

Каждый элемент является HashMap поиском моих значений.

1 из значений является числовым.

Я использую Collections.sort() для альфа-сортировки. Но числа сортируются в алфавитном порядке, а не в числовом порядке.

 protected ArrayList<HashMap<String, String>> myAccountList;

String Name = myAccountList.get(i).get("accountName");
Double balance = Double.valueOf(myAccountList.get("accountBalance"));  //is a number stored as a string
  

Итак, у меня сортировка работает с AccountName просто отлично.

 Collections.sort(myAccountList, new Comparator(){
   public int compare(Object o1, Object o2) {
      HashMap<String,String> old1 = (HashMap<String, String>) o1;
      HashMap<String,String> old2 = (HashMap<String, String>) o2;
      return old1.get("accountName").compareToIgnoreCase(old2.get("accountName"));
   }
});
  

Как мне отсортировать поле accountBalance как число? Я сомневаюсь, что это имеет значение, но я программирую приложение для Android.

Комментарии:

1. Почему бы вместо этого не сохранить остатки как a Double ? Например, HashMap<String, Double>

2. Хорошо, я могу это сделать. Но как будет выглядеть сортировка? И как мне заставить HashMap принимать <String, String>, а также <String, Double> ??

3. Вы не можете этого сделать, если у вас есть строки, а также двойные значения на карте. Однако вы могли бы использовать HashMap<String, Object> .

4. @DonRoby прав. Вообще не используйте a HashMap — см. Мой ответ.

Ответ №1:

Похоже, вы используете HashMap where вы должны создать свой собственный класс:

 public class Account {

   public final String name;
   public final Double balance;

   public Account(String name, Double balance) {
      this.name = name;
      this.balance = balance;
   }
}
  

(Примечание: в настоящее время этот класс неизменяем. Чтобы сделать его изменяемым, измените поля с public final на private и добавьте геттеры / сеттеры)

Затем вы можете сохранить их в a List<Account> и отсортировать соответствующим образом:

 //sort by name
Collections.sort(myAccountList, new Comparator<Account>(){
   public int compare(Account acc1, Account acc2) {
      return acc1.name.compareTo(acc2.name);
   }
});

//sort by balance
Collections.sort(myAccountList, new Comparator<Account>(){
   public int compare(Account acc1, Account acc2) {
      return acc1.balance.compareTo(acc2.balance);
   }
});
  

Обратите внимание на использование a Comparator с параметром generic type <Account> , поэтому вам не нужно приводить compareTo() аргументы из Object .

Ответ №2:

Вам нужно будет сделать что-то вроде этого:

 Double.valueOf(old1.get("accountBalance")).compareTo(Double.valueOf(old2.get("accountBalance")));
  

Для сортировки как по имени учетной записи, так и по балансу, вы должны проверить, равно ли первое сравнение 0 (они равны), и если да, верните сравнение баланса счета, предполагая, что сначала вы сортируете по имени учетной записи.