| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
alex_bond Новичок
Зарегистрирован: 25.09.2009 Сообщения: 60
|
Добавлено: Фев 01, 2010 0:07 Заголовок сообщения: Сортировка Map по значениям |
|
|
необходимо отсортировать мапу по значениям...
есть мапа Map<String, TeamStatistica>,где класс TeamStatistica представляет собой
| Код: |
public class TeamStatistica {
private Integer game, points;
public TeamStatistica( Integer points, Integer game) {
this.points = points;
this.games =game;
}
public Integer getGames() {
return games;
}
public void setGames(Integer games) {
this.games = games;
}
public Integer getPoints() {
return points;
}
public void setPoints(Integer points) {
this.points = points;
}
} |
и мне необходимо сортить мапу по полю points класса TeamStatisticа...как это осуществить...
просьба киньте похожие примеры
писал свой компаратор, но его можно применить только k Listу через Collections.sort(list, mycomp)((((( |
|
| Вернуться к началу |
|
 |
Rage Steel Новичок
Зарегистрирован: 21.01.2010 Сообщения: 42 Откуда: Россия, Москва
|
|
| Вернуться к началу |
|
 |
alex_bond Новичок
Зарегистрирован: 25.09.2009 Сообщения: 60
|
Добавлено: Фев 01, 2010 8:58 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
переписал под себя
| Код: |
private Map sortByValue(Map map) {
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((TeamStatistica) ((Map.Entry) (o1)).getValue()).getPoints()
.compareTo(((TeamStatistica) ((Map.Entry) (o2)).getValue()).getPoints());
}
});
Map result = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry)it.next();
result.put(entry.getKey(), entry.getValue());
}
return result;
} |
но что-то не работает((( |
|
| Вернуться к началу |
|
 |
Петр Бывалый

Зарегистрирован: 06.04.2009 Сообщения: 332 Откуда: Москва
|
Добавлено: Фев 01, 2010 13:23 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
| унаследуй для класса своего интерфейс компаратор, реализуй его метод compareTo и все будет работать. По форуму поищи тем много было как сортировать по определенному полю |
|
| Вернуться к началу |
|
 |
alex_bond Новичок
Зарегистрирован: 25.09.2009 Сообщения: 60
|
Добавлено: Фев 02, 2010 17:49 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
что я делаю не так?
вроде бы делаю как в примерах...реализую интерфейс Comparable и переопределяю метод compareTo
| Код: |
public class TeamStatistica implements Comparable<TeamStatistica> {
private Integer points;
public TeamStatistica(Integer points) {
this.points = points;
}
public Integer getPoints() {
return points;
}
public void setPoints(Integer points) {
this.points = points;
}
public int compareTo(TeamStatistica ts) {
return points.compareTo(ts.getPoints());
}
} |
ну а потом непосредственно сортирую мапу
| Код: |
private Map sortByValue(Map map) {
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((TeamStatistica) ((Map.Entry) (o1)).getValue()).getPoints()
.compareTo(((TeamStatistica) ((Map.Entry) (o2)).getValue()).getPoints());
}
});
Map result = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry)it.next();
result.put(entry.getKey(), entry.getValue());
}
return result;
} |
но результата нет((( |
|
| Вернуться к началу |
|
 |
Петр Бывалый

Зарегистрирован: 06.04.2009 Сообщения: 332 Откуда: Москва
|
Добавлено: Фев 02, 2010 18:06 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
зачем еще какие то методы придумывать.
| Код: |
package sort;
public class TeamStatistica implements Comparable<TeamStatistica> {
private Integer points;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TeamStatistica(String name, Integer points) {
this.name = name;
this.points = points;
}
public Integer getPoints() {
return points;
}
public void setPoints(Integer points) {
this.points = points;
}
public int compareTo(TeamStatistica ts) {
return points.compareTo(ts.getPoints());
}
public String toString() {
return this.getName() + " " + this.getPoints();
}
}
|
| Код: |
package sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class RunnerSort {
public static void main(String[] arg) {
List<TeamStatistica> teamStatisticas = new ArrayList<TeamStatistica>();
teamStatisticas.add(new TeamStatistica("Четвертый", 4));
teamStatisticas.add(new TeamStatistica("Второй", 2));
teamStatisticas.add(new TeamStatistica("Первый", 1));
teamStatisticas.add(new TeamStatistica("Третий", 3));
for(TeamStatistica teamStatistica: teamStatisticas) {
System.out.println(teamStatistica);
}
Collections.sort(teamStatisticas);
for(TeamStatistica teamStatistica: teamStatisticas) {
System.out.println(teamStatistica);
}
}
}
|
|
|
| Вернуться к началу |
|
 |
alex_bond Новичок
Зарегистрирован: 25.09.2009 Сообщения: 60
|
Добавлено: Фев 02, 2010 18:12 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
если бы мне было нужно сортить коллекцию элементов моего класа. то это не проблема...вопрос в том как сортить Map<String,TeamStatistica>?
мне нужно отсортировать мапу по значениям... |
|
| Вернуться к началу |
|
 |
Петр Бывалый

Зарегистрирован: 06.04.2009 Сообщения: 332 Откуда: Москва
|
Добавлено: Фев 02, 2010 18:19 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
| А что в ключе карты хранится должно? Вообще тогда не надо ничего писать просто воспользоватся HashMap в key засовывать point |
|
| Вернуться к началу |
|
 |
alex_bond Новичок
Зарегистрирован: 25.09.2009 Сообщения: 60
|
Добавлено: Фев 02, 2010 18:23 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
| ключом является строка представляющая собой имя команды. |
|
| Вернуться к началу |
|
 |
Староверъ Ктапубеп

Зарегистрирован: 26.01.2008 Сообщения: 4241 Откуда: Русь
|
Добавлено: Фев 04, 2010 12:10 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
Скорей всего придется хранить ключи в отдельной, отсортированной коллекции. Для этого можно даже создать класс, в котором будут значения синхронизироваться - если удалили элемент, то он должен удаляться из обоих коллекций. Т.е. где-то так:
| Код: |
public class BiSortedMap<T, K> {
private Map<T, K> directMap = new TreeMap<T, K>();
private Map<K, T> reverseMap = new TreeMap<K, T>();
} |
НО! Есть такие вещи, как apache commons-collections и google collections. Уверен на 80%, что там можно найти то, что тебе нужно. |
|
| Вернуться к началу |
|
 |
alex_bond Новичок
Зарегистрирован: 25.09.2009 Сообщения: 60
|
Добавлено: Фев 04, 2010 13:16 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
| спасибо большое) |
|
| Вернуться к началу |
|
 |
Петр Бывалый

Зарегистрирован: 06.04.2009 Сообщения: 332 Откуда: Москва
|
Добавлено: Фев 04, 2010 13:20 Заголовок сообщения: RE: Сортировка Map по значениям |
|
|
| Вообще это ошибка в проектировании. Почему нельзя сделать в модели поле "команда" и создавать карту mutlimap. вроде так называется. где ключ может быть не уникальный. и в ключ засовывать поле point модели. |
|
| Вернуться к началу |
|
 |
|