Использование компаратора без добавления класса

Я пытаюсь отсортировать массив по длине строки, я знаю о реализации Comparator, но мне было интересно, можно ли это сделать в моей функции без добавления каких-либо дополнительных классов или методов? В идеале я хочу вывести их от самого короткого до самого длинного, но это я могу сделать!

Вот фрагмент метода, с которым я хотел бы реализовать компаратор.

public static void sCompare(BufferedReader r, PrintWriter w) throws IOException {

    ArrayList<String> s= new ArrayList<String>();

    String line;
    int n = 0;
    while ((line = r.readLine()) != null) {
        s.add(line);
        n++;
    }
    //Collections.sort(s);  

    Iterator<String> i = s.iterator();
    while (i.hasNext()) {
        w.println(i.next());
    }
  }

Спасибо заранее за любые данные!


person choloboy    schedule 22.09.2013    source источник
comment
Вы могли бы реализовать логику сортировки с помощью циклов, но почему бы вам не использовать компаратор?   -  person jmj    schedule 22.09.2013
comment
Вы можете использовать анонимный класс, если хотите.   -  person nachokk    schedule 22.09.2013
comment
@JigarJoshi, я ищу самый эффективный способ сделать это. И просто предпочитаю использовать один класс. Возможно ли эффективное решение этой проблемы?   -  person choloboy    schedule 22.09.2013
comment
добавление другого класса не повлияет на эффективность, Collections.sort() работает на n log(n)   -  person jmj    schedule 22.09.2013
comment
@JigarJoshi, но это не будет сортировать его по длине строки, не так ли?   -  person choloboy    schedule 22.09.2013
comment
по умолчанию он работает в естественном порядке (технически реализация Comparable в классе String), но вам просто нужно обеспечить реализацию Comparator   -  person jmj    schedule 22.09.2013
comment
Есть ответы, которые показывают, как это сделать с анонимными классами, что соответствует духу того, что вы хотите. Но на самом деле, если вы просто сортируете файлы по длине строки, просто сделайте awk '{print length, $0;}' | sort -n | sed -e 's/^[0-9][0-9]* //g' :)   -  person Ray Toal    schedule 22.09.2013
comment
Спасибо за комментарий, @RayToal, но я не совсем его понимаю. Не могли бы вы объяснить это немного подробнее?   -  person choloboy    schedule 22.09.2013
comment
Первая часть берет ваш файл и для каждой строки выводит ее длину, за которой следует пробел, за которым следует строка. Вторая часть сортируется численно по столбцу 1, длине. Последняя часть удаляет столбец длины, заменяя последовательность цифр и пробел ничем. Это все довольно простые вещи оболочки; если это не знакомо вам, это нормально. Но учиться стоит ИМХО.   -  person Ray Toal    schedule 22.09.2013


Ответы (2)


Не вижу ничего плохого в реализации интерфейса Comparator. Если ваша единственная забота — делать все в функции, вы можете использовать анонимную реализацию. Что-то в духе:

    Collections.sort(s, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.length() - o2.length();
        }
    });  

(это заменит вам текущую строку //Collections.sort(s);)

PS: вы никогда не используете значение n.

PPS: вам, возможно, придется инвертировать o1 и o2 в зависимости от порядка, который вы хотите в выражении return.

Другой пример реализации интерфейса с анонимным класс

person nha    schedule 22.09.2013
comment
можно ли это отредактировать, чтобы обрабатывать случаи, когда строки одинаковой длины сортируются в естественном порядке? - person choloboy; 22.09.2013
comment
Спасибо, что приняли мой ответ. Что вы подразумеваете под «естественным порядком»? Какой заказ вы бы хотели? - person nha; 22.09.2013
comment
скажем, у меня есть {hello, heelloooo, apple, appppplleee} вывод будет apple hello heelloooo appppplleee... Так что, по сути, случаи, когда длина одинакова, идет в алфавитном порядке - person choloboy; 22.09.2013
comment
Я понимаю. А что бы вы предпочли? Анти-алфавит для слов одинаковой длины? Или вы имеете в виду какую-то стабильность? - person nha; 22.09.2013
comment
я бы хотел, нормальный алфавит для слов одинаковой длины - person choloboy; 22.09.2013
comment
Я не уверен здесь ... Я подумаю об этом, но тем временем вам лучше всего открыть еще один вопрос, я думаю. - person nha; 22.09.2013

Я собираюсь предположить, что под «классом» вы подразумеваете «класс верхнего уровня», что позволяет использовать анонимный класс:

Collections.sort(s, new Comparator<String>() {
    public int compare(String a, String b) {
        // java 1.7:
        return Integer.compare(a.length(), b.length());
        // java 1.6
        return a.length() - b.length();
    }
});
person Bohemian♦    schedule 22.09.2013
comment
спасибо за вашу помощь @Bohemian. Вы случайно не знаете, что означает эта ошибка? Это из .compare из последней строки кода - person choloboy; 22.09.2013
comment
Integer.compare был добавлен в Java 1.7. Вы используете 1.6? - person James; 22.09.2013