#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 (они равны), и если да, верните сравнение баланса счета, предполагая, что сначала вы сортируете по имени учетной записи.