RSS 2.0 Версия для КПК (Бета)
Конференция JavaTalks  :  Java форум
Java форум JavaTalks
форум программистов 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Сортировка Map по значениям

 
Начать новую тему   Ответить на тему    Список форумов Java форум JavaTalks -> Коллекции (Java Collection Framework)
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
Откуда: Россия, Москва

СообщениеДобавлено: Фев 01, 2010 7:56    Заголовок сообщения: RE: Сортировка Map по значениям Ответить с цитатой

Первое что нашлось в Google, правда на английском языке:
http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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%, что там можно найти то, что тебе нужно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
alex_bond
Новичок


Зарегистрирован: 25.09.2009
Сообщения: 60

СообщениеДобавлено: Фев 04, 2010 13:16    Заголовок сообщения: RE: Сортировка Map по значениям Ответить с цитатой

спасибо большое)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Петр
Бывалый


Зарегистрирован: 06.04.2009
Сообщения: 332
Откуда: Москва

СообщениеДобавлено: Фев 04, 2010 13:20    Заголовок сообщения: RE: Сортировка Map по значениям Ответить с цитатой

Вообще это ошибка в проектировании. Почему нельзя сделать в модели поле "команда" и создавать карту mutlimap. вроде так называется. где ключ может быть не уникальный. и в ключ засовывать поле point модели.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Java форум JavaTalks -> Коллекции (Java Collection Framework) Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Этот сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

GetJava Download Button Rambler's Top100
Хостинг от bizname.ru
При поддержке hitech.com.ua