powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сортировка по значениям в TreeMap?
25 сообщений из 35, страница 1 из 2
Сортировка по значениям в TreeMap?
    #33172307
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Подскажите, пожалуйста, можно ли в TreeMap, используя компоратор сортировать не по ключам, а по их значениям? Если нельзя, то как подойти к этой проблеме? Нужна идея.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33172341
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создать класс ключа, который бы имел ссылку на объект-значение И в компараторе сравнивать эти значения как-нибудь. Правда, класс объектов-значений тоже должен будет реализовывать Comparable…
Что-то другого на ум не идёт, хотя и это - вырезка гланд автогеном. А зачем надо сортировать по значениям?
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33172437
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
 import  java.util.Comparator;
 import  java.util.TreeMap;
 import  java.util.Iterator;
 import  java.util.Map;
 import  java.util.*;

 public   class  SortedTreeMap  implements  Comparator
{
   private  TreeMap tm =  new  TreeMap();

   public   static   void  main( String[] args )
  {
    SortedTreeMap stm =  new  SortedTreeMap();
  }

   public  SortedTreeMap()
  {
    tm.put( "abc", "book" );
    tm.put( "ix ", "art" );
    tm.put( "lx ", "cook" );
    tm.put( "nx ", "dog" );
    tm.put( "rx ", "cool" );
    tm.put( "xyz", "rest" );
    tm.put( "uvw", "lost" );
    tm.put( "tpr", "value");
    TreeMap tm1 =  new  TreeMap( this );
    tm1.putAll( tm );
    Iterator it = tm1.entrySet().iterator();
     while ( it.hasNext() )
    {
      Map.Entry me = (Map.Entry)it.next();
      System.out.println(me.getKey() + "  " + (String)me.getValue() + "\n");
    }
  }
   public   int  compare( Object o1, Object o2 )
  {
    return  ((String)tm.get( o1 )).compareTo( (String)tm.get( o2 )) ;
  }
}


...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33176735
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Учусь, а учиться проще на нужных вещах. Сделал простенькую программку, которая создает частотный словарь иностранных слов в файлах натянутых из инета. Помогает понять сколько не знаешь слов характерных для определенной темы на аглицком.

Спасибо за подсказки.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33179075
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to johanna
Не будет вВш пример сортировать по значениям ключей.
По умолчанию compare( Object a, Object b ) как объект принимает именно уникальные ключи. А проблема, как заставить принимать не уникальные значения ключей. Должен вроде быть какой-то выход. Почему нельзя по значениям сортировать?
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33179095
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
toСергей. Р.
не только будет, он еще это и делает.
проверьте сами.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33179149
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
 import  java.util.Comparator;
 import  java.util.TreeMap;
 import  java.util.Iterator;
 import  java.util.Map;
 import  java.util.*;

 public   class  SortedTreeMap  implements  Comparator
{
   private  TreeMap tm =  new  TreeMap();

   public   static   void  main( String[] args )
  {
    SortedTreeMap stm =  new  SortedTreeMap();
  }

   public  SortedTreeMap()
  {
    tm.put( "abc", "book" );
    tm.put( "ix ", "art" );
    tm.put( "lx ", "cook" );
    tm.put( "nx ", "dog" );
    tm.put( "rx ", "cool" );
    tm.put( "xyz", "rest" );
    tm.put( "uvw", "lost" );
    tm.put( "tpr", "value");   
    System.out.println("содержимое папки, сортированной по ключам");
    Iterator it = tm.entrySet().iterator();
     while ( it.hasNext() )
    {
      Map.Entry me = (Map.Entry)it.next();
      System.out.println(me.getKey() + "  " + (String)me.getValue() + "\n");
    }
     System.out.println("новая папка созданная и отсортированная по значениям");   
    TreeMap tm1 =  new  TreeMap( this );
    tm1.putAll( tm );
    it = tm1.entrySet().iterator();
     while ( it.hasNext() )
    {
      Map.Entry me = (Map.Entry)it.next();
      System.out.println(me.getKey() + "  " + (String)me.getValue() + "\n");
    }
  }
   public   int  compare( Object o1, Object o2 )
  {
    return  ((String)tm.get( o1 )).compareTo( (String)tm.get( o2 )) ;
  }
}
на выходе получаем:

содержимое папки, сортированной по ключам
abc book

ix art

lx cook

nx dog

rx cool

tpr value

uvw lost

xyz rest


новая папка созданная и отсортированная по значениям

ix art

abc book

lx cook

rx cool

nx dog

uvw lost

xyz rest

tpr value

Process terminated with exit code 0
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33179153
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sorry, слово "уникальные" пропустила.
организуйте свои данные в другую структуру- вот и решение вашей проблемы.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33180318
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда, на всякий случай, извиняюсь заранее. Переделка моего скрипта по Вашему предложению меня не осчастливила. Пока. Видимо, я что-то просмотрел. Буду разбираться с Вашим чистым примером. Спасибо за отзывчивость.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33180696
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно работает, только понять каким образом я не могу.
В классике компаратор выделяют в отдельный класс и работают с ним так:
TM = new TreeMap(new MyComp () ); В этом случае сортируется по ключам.
В Вашем пример реально сортирует по значениям, но мне не понятно
как это происходит и как быть, если значения цифры? Чувствую
недостаток теории, но где ее восполнить? В моих книгах и инете пока ничего путного не нашел. Не подскажете ли, где тут собака зарыта. Как определяются объекты, которые нужно сравнить, если они из пары ключ/значение и как быть если значение int?
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33180772
d(°_°)b     .
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей. Р., вам же уже сказали, что отсортировать TreeMap по ключам не получится, т.к., если у разных ключей будут одинаковые значения, TreeMap скушает все пары кроме последней.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33180800
d(°_°)b     .
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, имелось ввиду: отсортировать по значениям не получится :)
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33180969
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
 import  java.util.Map;
 import  java.util.TreeMap;
 import  java.util.Comparator;

 public   class  WordCounter {

     private  Map<String, Integer> byWord =  new  TreeMap<String, Integer>();

     private  Map<String, Integer> byCount =  new  TreeMap<String, Integer>( new  Comparator<String>() {
         public   int  compare(String o1, String o2) {

            Integer i1 = byWord.containsKey(o1) ? byWord.get(o1) :  0 ;
            Integer i2 = byWord.containsKey(o2) ? byWord.get(o2) :  0 ;

             int  compareValues = i1.compareTo(i2);
             return  compareValues ==  0  ? o1.compareTo(o2) : compareValues;
        }
    });

     public  WordCounter addWord(String word) {
        Integer count = (byWord.containsKey(word) ? byWord.get(word) :  0 ) +  1 ;
        byCount.remove(word);
        byWord.put(word, count);
        byCount.put(word, count);
         return   this ;
    }

     public  Map byWord() {  return  byWord; }

     public  Map byCount() {  return  byCount; }

     public   static   void  main(String[] args) {
        WordCounter c =  new  WordCounter();

        c.addWord("yyy").addWord("yyy").addWord("xxx");
        c.addWord("yyy").addWord("xxx").addWord("zzz");
        c.addWord("zzz").addWord("yyy").addWord("bbb");
        c.addWord("bbb").addWord("bbb").addWord("bbb");
        c.addWord("kkk").addWord("kkk").addWord("kkk");

        System.out.println(c.byWord());
        System.out.println(c.byCount());
    }
}


Сергей. Р.В Вашем пример реально сортирует по значениям
В примере выше была ошибка.


Как определяются объекты, которые нужно сравнить, если они из пары ключ/значение и как быть если значение int?

- Ключём в map сортируемом по значению должен быть не исходный ключ (слово), а (ключ + значение). Это не обязательно писать (ключ и так уникален), но нужно иметь ввиду.

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

- int - не может быть значением, только Integer. Об этом пишут в любой книге по java.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33180985
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
 import  java.util.Map;
 import  java.util.TreeMap;
 import  java.util.Comparator;

 public   class  WordCounter {

     private  Map<String, Integer> byWord =  new  TreeMap<String, Integer>();

     private  Map<String, Integer> byCount =  new  TreeMap<String, Integer>( new  Comparator<String>() {
         public   int  compare(String o1, String o2) {

            Integer i1 = byWord.containsKey(o1) ? byWord.get(o1) :  0 ;
            Integer i2 = byWord.containsKey(o2) ? byWord.get(o2) :  0 ;

             int  compareValues = i1.compareTo(i2);
             return  compareValues ==  0  ? o1.compareTo(o2) : compareValues;
        }
    });

     public  WordCounter addWord(String word) {
        Integer count = (byWord.containsKey(word) ? byWord.get(word) :  0 ) +  1 ;
        byCount.remove(word);
        byWord.put(word, count);
        byCount.put(word, count);
         return   this ;
    }

     public  Map byWord() {  return  byWord; }

     public  Map byCount() {  return  byCount; }

     public   static   void  main(String[] args) {
        WordCounter c =  new  WordCounter();

        c.addWord("yyy").addWord("yyy").addWord("xxx");
        c.addWord("yyy").addWord("xxx").addWord("zzz");
        c.addWord("zzz").addWord("yyy").addWord("bbb");
        c.addWord("bbb").addWord("bbb").addWord("bbb");
        c.addWord("kkk").addWord("kkk").addWord("kkk");

        System.out.println(c.byWord());
        System.out.println(c.byCount());
    }
}


Эх, чтоб он еще и откомпилировался. Умом я его объять не могу пока.
Похоже проще обходной путь найти. В конце концов мне надо просто отсортировать по не уникальному значению и распечатать. Нормальные герои всегда идут в обход.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33181025
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей. Р.Похоже проще обходной путь найти. В конце концов мне надо просто отсортировать по не уникальному значению и распечатать. Нормальные герои всегда идут в обход.
правильно, самое простое сказать своей базе, где данные хранятся
Код: plaintext
select key, value from myTable order by value;
а потом уже в подходящую структуру засовывать
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33181027
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs В примере выше была ошибка.
какая?
пример выше сортировал по уникальным значениям
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33181079
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей. Р.
Эх, чтоб он еще и откомпилировался. Умом я его объять не могу пока.
Похоже проще обходной путь найти. В конце концов мне надо просто отсортировать по не уникальному значению и распечатать. Нормальные герои всегда идут в обход.

Какие проблемы с объятием умом? :) Единственное над чем стоит задуматься, так это методо addWord и тем, почему не один оператор там нельзя переставить :)

Нормальному герою стоит поставить java 1.5, либо заменить в моём коде генерики на касты классов.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33181080
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna NotGonnaGetUs В примере выше была ошибка.
какая?
пример выше сортировал по уникальным значениям

Это был ответ не вам :)

Человек написал, что ваш код работает для его целей. Он работает, но как вы сами отметили выше, не для его целей. Автору требует сортировка по не уникальным значениям.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33181132
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я может быть не верно где-то выразился. В директории находятся текстовые документы на основе, которых строится частотный словарь. В хэшах все хорошо кроме частной задачи, как сделать сортироку по значениям (которые естественно не уникальны, т.к. разные слова могут появляться одинаковое число раз в исследуемом материале). И хочется сделать не через задницу. Как через задницу уже придумал, но это не красиво выглядит.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33181198
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей. Р.Я может быть не верно где-то выразился. В директории находятся текстовые документы на основе, которых строится частотный словарь. В хэшах все хорошо кроме частной задачи, как сделать сортироку по значениям (которые естественно не уникальны, т.к. разные слова могут появляться одинаковое число раз в исследуемом материале). И хочется сделать не через задницу. Как через задницу уже придумал, но это не красиво выглядит.

Фу, блин. Если что-то не ясно - спроси. В коде который я привёл, treeMap сортируется по "значениям".

[offtopic]
Кстати, кто быстрее? :)

Примерно так тестировать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 public   interface  ICounter {
    ICounter addWord(String word);
    Object byCount();
}

 public   class  CounterTester {
     private   static   void  test(ICounter c) {
        System.out.println(c.getClass().getName());
         long  time = System.currentTimeMillis();
         for  ( int  i= 0 ; i<  1000000 ; i++){
            c.addWord("yyy").addWord("yyy").addWord("xxx");
            c.addWord("yyy").addWord("xxx").addWord("zzz");
            c.addWord("zzz").addWord("yyy").addWord("bbb");
            c.addWord("bbb").addWord("bbb").addWord("bbb");
            c.addWord("kkk").addWord("kkk").addWord("kkk");
            c.addWord("yy").addWord("yy").addWord("xx");
            c.addWord("yy").addWord("xx").addWord("zz");
            c.addWord("zz").addWord("yy").addWord("bb");
            c.addWord("bb").addWord("bb").addWord("bb");
            c.addWord("kk").addWord("kk").addWord("kk");
        }
        System.out.println(c.byCount());
        System.out.println("Time:" + (System.currentTimeMillis() - time));
    }

     public   static   void  main(String[] args) {
        test( new  SuperCounter());
    }
}

Эта штука в 20(!) раз быстрее каунтера, которого я нарисовал раньше :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
 import  java.util.HashMap;
 import  java.util.TreeMap;
 import  java.util.Comparator;

 public   class  SuperCounter  implements  ICounter {

     private   class  MutableInteger {
         int  value;
         public  String toString() {
             return  String.valueOf(value);
        }
    }

     private  HashMap words =  new  HashMap();

     public  ICounter addWord(String word) {
        MutableInteger count = (MutableInteger) words.get(word);
         if  (count ==  null ) {
            count =  new  MutableInteger();
            words.put(word, count);
        }
        count.value++;
         return   this ;
    }

     public  Object byCount() {
        TreeMap sortedMap =  new  TreeMap( new  Comparator() {
             public   int  compare(Object o1, Object o2) {
                 int  i1 = ((MutableInteger) words.get(o1)).value;
                 int  i2 = ((MutableInteger) words.get(o2)).value;
                 if  (i1 > i2)  return   1 ;
                 if  (i1 < i2)  return  - 1 ;
                 return  ((String) o1).compareTo((String) o2);
            }
        });
        sortedMap.putAll(words);
         return  sortedMap;
    }
}
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33181576
Сергей. Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUsФу, блин. Если что-то не ясно - спроси. В коде который я привёл, treeMap сортируется по "значениям".


Спасибо за помощь, но будьте реалистом. Кто будет внимательно разбираться с примерм, который даже откомпилировать невозможно? Проблему я уже решил, только слова с малых и заглавных букв в разные деревья попадают и учитываются отдельно. Может подскажите, как в один регистр их перекидывать?
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33182207
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Сергей. Р.
прежде чем выбирать структуру для своих данных, не проще ли сначала проанализировать что я хочу сделать с моими данными:
откуда получить,
как сохранить,
как обработать,
как показать
- а потом согласно этому выбирать подходящие для этого структуры.
Т.е. если бы мне надо было сортировать данные по значениям, то я бы, например,
TreeMap для своих данных не выбрала.
Другим языком к чему брать чайник если собираешься варить суп?
Суп, конечно, можно и в чайнике сварить, но удобно ли это?
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33182422
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постановка Сергея достаточно сложна для простого
применения классов коллекций. По крайней мере
мне показалось что реализация тянет на интерфейс
таблицы к встраиваемой СУБД.

ИМХО.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33183099
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей. РСпасибо за помощь, но будьте реалистом. Кто будет внимательно разбираться с примерм, который даже откомпилировать невозможно?
Я реалист. Пример отлично компилируется. Первый стребует jdk1.5, второму пойдёт всё кроме самых древних версий.

Проблему я уже решил
Расскажешь как?

Может подскажите, как в один регистр их перекидывать?
String#toLowerCase()

mayton
реализация тянет на интерфейс таблицы к встраиваемой СУБД

Задача: подсчитать количество вхождений разных слов в текстовых файлах и отсортировать из по количеству вхождений.

Постановку конечно можно бесконечно долго уродовать, предъявляя разные хитрые требования, но учитывая слова Сергея Р "Учусь, а учиться проще на нужных вещах." , на верное не стоит этим заморачиваться :)
Самостоятельной ценности такая задача не имеет, а конкретное прикладное использование накладывает свои ограничения.

Мне кажется, что в общем случае, дерево с узлами-символами (+ аттрибут количество вхождений) для быстрого нахождения слова и инкремента счётчика + итератор по этому дереву, чтобы получить список "слово, количество" + быстрая сортировка - великолепное решение. Различных слов не так уж много, чтобы начались проблемы с нехваткой памяти.
...
Рейтинг: 0 / 0
Сортировка по значениям в TreeMap?
    #33183329
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs wrote:
> Задача: подсчитать количество вхождений разных слов в текстовых файлах и
> отсортировать из по количеству вхождений.
>
Задача элементарно решается на PERL:
Код: plaintext
1.
2.
3.
4.
map { $h{lc $_}++} ($line =~ m/\w+/gc)  while($line = <>);
for $key ( sort { $h{$b} <=> $h{$a} }  keys %h) {
         print "$key\t$h{$key}\n";
}
Не Java'й единой жив программист !
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Сортировка по значениям в TreeMap?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]