Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

TreeSet : сортировка.
Список форумов
 ->  Коллекции (Java Collection Framework)


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Zhazhah : 184
Новичок
Откуда: Краснодар

СообщениеМай 11, 2010 15:49 
Ответить с цитатой
Здравствуйте. Я пытаюсь сортировать строки такого вида:
2
1
5
10

Нужен такой результат
10
5
2
1

Пробую с помощью TreeSet.
Код:
TreeSet<String> ts = new TreeSet<String>();
ts.add("2");
ts.add("1");
ts.add("5");
ts.add("10");


Iterator<String> it = ts.descendingIterator();
while(it.hasNext()) {
      System.out.println(it.next());
}

На первый взгляд всё как надо, но в результате:
5
2
10
1
К началу Посмотреть профиль Отправить личное сообщение
finalizer : 1794
Завсегдатай

СообщениеМай 11, 2010 16:22 
Ответить с цитатой
Вам нужно написать свою реализацию Comparator-а и передать ссылку на неё конструктору TreeSet.
К началу Посмотреть профиль Отправить личное сообщение
Zhazhah : 184
Новичок
Откуда: Краснодар

СообщениеМай 11, 2010 17:04 
Ответить с цитатой
Код:
import java.util.*;

class Sort implements Comparator<String> {
    public int compare(String a,String b) {
        return b.compareTo(a);
    }
}

public class Main {
    public static void main(String[] args) {

        TreeSet<String> ts = new TreeSet<String>(new Sort());
        ts.add("2");
        ts.add("5");
        ts.add("10");
        ts.add("1");

       
        for(String e:ts) {
            System.out.println(e);
        }
    }
}


Вывод такой же
К началу Посмотреть профиль Отправить личное сообщение
Pahan : 745
Постоянный посетитель
Откуда: Минск

СообщениеМай 11, 2010 17:11 
Ответить с цитатой
В данном случае, хочется что бы строки сравнивались как числа. Поэтому String.compareTo(String) не подойдет. Легче всего преобразовать их в числа и сравнить.
Както так(не компилил, на глаз):
Код:
class Sort implements Comparator<String>  {
    public int compare(String a,String b) {
        return new Integer(b).compareTo(new Integer(a));
    }
}
К началу Посмотреть профиль Отправить личное сообщение
finalizer : 1794
Завсегдатай

СообщениеМай 11, 2010 18:22 
Ответить с цитатой
Pahan писал(а):
В данном случае, хочется что бы строки сравнивались как числа. Поэтому String.compareTo(String) не подойдет. Легче всего преобразовать их в числа и сравнить.
Както так(не компилил, на глаз):
Код:
class Sort implements Comparator<String>  {
    public int compare(String a,String b) {
        return new Integer(b).compareTo(new Integer(a));
    }
}

Создавать Integer совершенно незачем:
Код:
class StringNumberComparator implements Comparator<String>  {
    public int compare(String a, String b) {
        return Integer.parseInt(a) - Integer.parseInt(b);
    }
}
К началу Посмотреть профиль Отправить личное сообщение
Zhazhah : 184
Новичок
Откуда: Краснодар

СообщениеМай 11, 2010 19:22 
Ответить с цитатой
Спасибо. Только есть одна проблема сразу не стал писать думал не всплывёт. На самом деле нужно сортировать список такого вида

2:342
1:343
5:344
10:345

по этому только строка. Конечно есть для этого Map но там ключи должны быть уникальными. т.е в моём списке есть повторяющиеся ключи

2:342
1:343
5:344
10:345
2:346
5:347

Может есть какой нибудь класс где уникальность ключей можно опустить.
К началу Посмотреть профиль Отправить личное сообщение
finalizer : 1794
Завсегдатай

СообщениеМай 11, 2010 20:05 
Ответить с цитатой
http://javatalks.ru/sutra38230.php#38230

Замените точки на двоеточия и опционально массив на List. В последнем случае сортируйте при помощи Collections.sort()
К началу Посмотреть профиль Отправить личное сообщение
Zhazhah : 184
Новичок
Откуда: Краснодар

СообщениеМай 11, 2010 21:54 
Ответить с цитатой
Спасибо всем. Вот наверное наилучший способ работает почти также быстро как и с цифрами.

Код:
import java.util.*;

        class Sort implements Comparator<String> {
       public int compare(String a,String b) {
           int o1 = Integer.parseInt(b.substring(0, b.indexOf(".")));
                int o2 = Integer.parseInt(a.substring(0, a.indexOf(".")));

                return o1 > o2 ? 1 : -1;
       }
   }

   public class Main {
            private static long start,end;
       public static void main(String[] args) {
                start = System.currentTimeMillis();
           TreeSet<String> ts = new TreeSet<String>(new Sort());

                for(int i=1; i<=5000; i++) {
                    ts.add(i+".767");
                    ts.add(i+".766");
                }


           for(String e:ts) {
               System.out.println(e);
           }
                end = System.currentTimeMillis();
                end = (end - start);
                System.out.println(end);
       }
   }
К началу Посмотреть профиль Отправить личное сообщение
welvet : 211
Новичок

СообщениеМай 12, 2010 8:46 
Ответить с цитатой
Zhazhah писал(а):
Вот наверное наилучший способ работает почти также быстро как и с цифрами.

Если важна скорость - то лучше воспользоваться реализацией q_sort, про алгоритмы сортировки хорошо написано тут: http://www.sorting-algorithms.com/
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
finalizer : 1794
Завсегдатай

СообщениеМай 12, 2010 14:05 
Ответить с цитатой
welvet писал(а):
Zhazhah писал(а):
Вот наверное наилучший способ работает почти также быстро как и с цифрами.

Если важна скорость - то лучше воспользоваться реализацией q_sort, про алгоритмы сортировки хорошо написано тут: http://www.sorting-algorithms.com/

TreeSort сортирует в процессе добавления данных и делает это так же быстро и фактически тем же методом, как quicksort.
К началу Посмотреть профиль Отправить личное сообщение
demon_vin : 5
Новичок

СообщениеОкт 20, 2011 11:17 
Ответить с цитатой
Всем добрый день !
По данным данного топика написал компаратор . Но в зависимости , от того , какой метод вывода использовать - список выдается разный .
Вопрос - почему ? Ведь на сколько я понимаю , при занесении значений компаратор сразу определяет порядок .



Код:

package a1;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class A1 {

    public static void main(String[] args) {
        TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                return (Integer.parseInt(o1) == Integer.parseInt(o2) ? 0 : (Integer.parseInt(o1) < Integer.parseInt(o2)) ? -1 : 1);
            }
        });
        ts.add("2");
        ts.add("1");
        ts.add("5");
        ts.add("10");
        for (String item : ts) {
            System.out.println(item);

        }
        Iterator<String> it = ts.descendingIterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
К началу Посмотреть профиль Отправить личное сообщение
HalfKorean : 88
Новичок

СообщениеОкт 28, 2011 8:40 
Ответить с цитатой
Цитата:
список выдается разный

Ну так вы во втором случае используете descendingIterator, что намекает.
К началу Посмотреть профиль Отправить личное сообщение
MidNight^er : 47
Новичок
Откуда: Белгород

СообщениеНоя 01, 2011 21:34 
Ответить с цитатой
demon_vin писал(а):
Всем добрый день !
По данным данного топика написал компаратор . Но в зависимости , от того , какой метод вывода использовать - список выдается разный .
Вопрос - почему ? Ведь на сколько я понимаю , при занесении значений компаратор сразу определяет порядок .



Код:

package a1;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class A1 {

    public static void main(String[] args) {
        TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                return (Integer.parseInt(o1) == Integer.parseInt(o2) ? 0 : (Integer.parseInt(o1) < Integer.parseInt(o2)) ? -1 : 1);
            }
        });
        ts.add("2");
        ts.add("1");
        ts.add("5");
        ts.add("10");
        for (String item : ts) {
            System.out.println(item);

        }
        Iterator<String> it = ts.descendingIterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}


Класс компаратор должен реализовывать интерфейс компаратор и соответственно метод компаратора. Гляньте на мой вариант если ещё актуально. Здесь в компараторе сравниваются сначала две подстроки, а затем сравниваются строки.
Код:

import java.util.*;

class MyComp implements Comparator {
   public int compare(Object a, Object b) {
      String aStr, bStr;
      int i, j, k;
      
      aStr = (String) a;
      bStr = (String) b;
      
      i = aStr.lastIndexOf(':');
      j = bStr.lastIndexOf(':');
      
      k = aStr.substring(i).compareTo(bStr.substring(j));
      if (k == 0) {
         return aStr.compareTo(bStr);
      } else
         return k;      
   }
}

class TreeSetDemo {
   public static void main(String[] args) {
      TreeSet ts = new TreeSet(new MyComp());
      
      ts.add(new String("32:234"));
      ts.add(new String("349:583"));
      ts.add(new String("2:34"));
      ts.add(new String("45:253"));
      
      System.out.println(ts);
   }
}
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
MidNight^er : 47
Новичок
Откуда: Белгород

СообщениеНоя 01, 2011 21:35 
Ответить с цитатой
// оффтоп чтобы исправить повтор поста.
Этот PHP Debug Mode меня доконает
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
s_oleg : 68
Новичок
Откуда: Minsk

СообщениеНоя 26, 2011 16:54 
Ответить с цитатой
Код:
public final class SortedUtil {

    public static <T extends Comparable<? super T>> List<T> asSortedList(Collection<T> collection) {
        List<T> list = new ArrayList<T>(collection);
        java.util.Collections.sort(list);
        return list;
    }

    public static <T extends Comparable<? super T>> Set<T> asSortedSet(Collection<T> collection) {
        TreeSet<T> set = new TreeSet<T>(collection);
        return set.descendingSet();
    }
}

_________________
Болтовня ничего не стоит. Покажите мне код. - Linus Torvalds
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Коллекции (Java Collection Framework)


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


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

Хостинг от bizname.ru