Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сортировка по значениям в TreeMap? / 25 сообщений из 35, страница 1 из 2
18.07.2005, 21:42
    #33172307
Сергей. Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Здравствуйте. Подскажите, пожалуйста, можно ли в TreeMap, используя компоратор сортировать не по ключам, а по их значениям? Если нельзя, то как подойти к этой проблеме? Нужна идея.
...
Рейтинг: 0 / 0
18.07.2005, 22:13
    #33172341
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Создать класс ключа, который бы имел ссылку на объект-значение И в компараторе сравнивать эти значения как-нибудь. Правда, класс объектов-значений тоже должен будет реализовывать Comparable…
Что-то другого на ум не идёт, хотя и это - вырезка гланд автогеном. А зачем надо сортировать по значениям?
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
19.07.2005, 02:04
    #33172437
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Код: 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
20.07.2005, 18:28
    #33176735
Сергей. Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Учусь, а учиться проще на нужных вещах. Сделал простенькую программку, которая создает частотный словарь иностранных слов в файлах натянутых из инета. Помогает понять сколько не знаешь слов характерных для определенной темы на аглицком.

Спасибо за подсказки.
...
Рейтинг: 0 / 0
21.07.2005, 22:13
    #33179075
Сергей. Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
to johanna
Не будет вВш пример сортировать по значениям ключей.
По умолчанию compare( Object a, Object b ) как объект принимает именно уникальные ключи. А проблема, как заставить принимать не уникальные значения ключей. Должен вроде быть какой-то выход. Почему нельзя по значениям сортировать?
...
Рейтинг: 0 / 0
21.07.2005, 22:42
    #33179095
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
toСергей. Р.
не только будет, он еще это и делает.
проверьте сами.
...
Рейтинг: 0 / 0
22.07.2005, 00:00
    #33179149
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Код: 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
22.07.2005, 00:14
    #33179153
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
sorry, слово "уникальные" пропустила.
организуйте свои данные в другую структуру- вот и решение вашей проблемы.
...
Рейтинг: 0 / 0
22.07.2005, 15:04
    #33180318
Сергей. Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Тогда, на всякий случай, извиняюсь заранее. Переделка моего скрипта по Вашему предложению меня не осчастливила. Пока. Видимо, я что-то просмотрел. Буду разбираться с Вашим чистым примером. Спасибо за отзывчивость.
...
Рейтинг: 0 / 0
22.07.2005, 17:29
    #33180696
Сергей. Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Действительно работает, только понять каким образом я не могу.
В классике компаратор выделяют в отдельный класс и работают с ним так:
TM = new TreeMap(new MyComp () ); В этом случае сортируется по ключам.
В Вашем пример реально сортирует по значениям, но мне не понятно
как это происходит и как быть, если значения цифры? Чувствую
недостаток теории, но где ее восполнить? В моих книгах и инете пока ничего путного не нашел. Не подскажете ли, где тут собака зарыта. Как определяются объекты, которые нужно сравнить, если они из пары ключ/значение и как быть если значение int?
...
Рейтинг: 0 / 0
22.07.2005, 18:02
    #33180772
d(°_°)b     .
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Сергей. Р., вам же уже сказали, что отсортировать TreeMap по ключам не получится, т.к., если у разных ключей будут одинаковые значения, TreeMap скушает все пары кроме последней.
...
Рейтинг: 0 / 0
22.07.2005, 18:13
    #33180800
d(°_°)b     .
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
извините, имелось ввиду: отсортировать по значениям не получится :)
...
Рейтинг: 0 / 0
22.07.2005, 20:19
    #33180969
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Код: 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
22.07.2005, 20:57
    #33180985
Сергей. Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
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
22.07.2005, 22:08
    #33181025
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Сергей. Р.Похоже проще обходной путь найти. В конце концов мне надо просто отсортировать по не уникальному значению и распечатать. Нормальные герои всегда идут в обход.
правильно, самое простое сказать своей базе, где данные хранятся
Код: plaintext
select key, value from myTable order by value;
а потом уже в подходящую структуру засовывать
...
Рейтинг: 0 / 0
22.07.2005, 22:11
    #33181027
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
NotGonnaGetUs В примере выше была ошибка.
какая?
пример выше сортировал по уникальным значениям
...
Рейтинг: 0 / 0
23.07.2005, 01:07
    #33181079
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
Сергей. Р.
Эх, чтоб он еще и откомпилировался. Умом я его объять не могу пока.
Похоже проще обходной путь найти. В конце концов мне надо просто отсортировать по не уникальному значению и распечатать. Нормальные герои всегда идут в обход.

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

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

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

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

Фу, блин. Если что-то не ясно - спроси. В коде который я привёл, 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
24.07.2005, 12:55
    #33181576
Сергей. Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
NotGonnaGetUsФу, блин. Если что-то не ясно - спроси. В коде который я привёл, treeMap сортируется по "значениям".


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

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

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

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

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

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

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

Мне кажется, что в общем случае, дерево с узлами-символами (+ аттрибут количество вхождений) для быстрого нахождения слова и инкремента счётчика + итератор по этому дереву, чтобы получить список "слово, количество" + быстрая сортировка - великолепное решение. Различных слов не так уж много, чтобы начались проблемы с нехваткой памяти.
...
Рейтинг: 0 / 0
25.07.2005, 17:18
    #33183329
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по значениям в TreeMap?
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Сортировка по значениям в TreeMap? / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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