| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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 |
|
|
|
|
|
|
 |
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/ |
|
|
|
 |
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);
}
}
|
|
|
|
|
 |
MidNight^er : 47 Новичок Откуда: Белгород
|
Ноя 01, 2011 21:35 |
|
|
// оффтоп чтобы исправить повтор поста.
Этот PHP Debug Mode меня доконает |
|
|
|
 |
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 |
|
|
|
 |
|
|