Найти слова а потом их отсортировать

194
15 августа 2017, 13:26

Есть задание, где сначала надо вычислить слова с длинной слова больше среднего значения, a потом отсортировать их так, чтобы сначала шли слова с числами.

Сделал что-то типа этого. Как упростить и выполнить сортировку? Как сначала вывести слова с цифрами, а потом просто слова?

вот мой пример:

public List<String> convertText(String text) {
    String[] words = text.split("\\p{P}?[ \\t\\n\\r]+"); // split by whitespace
    int count = 0;
    double sum = 0;
    for (String word : words) {
        double wordLength = word.length();
        sum += wordLength;
        count++;
    }
    final double average = sum / count;
    List<String> list = Arrays.stream(words).filter(s -> s.length()>= average).collect(Collectors.toList());
    for (int i = 0; i < list.size(); i++) {
        if (!list.get(i).matches(".*\\d+.*")){
            list.add(list.size() - 1, list.remove(i));
        }
    }
    return list;
}
Answer 1

Я о Java, конечно, мало чего знаю, но рабочее решение показать могу. Написал я простой код, в котором есть temporary массивы, - это проще для понимания.

public List<String> convertText(String text) {
    String[] words = text.split("\\p{P}?[ \\t\\n\\r]+");
    int count = 0;
    double sum = 0;
    for (String word : words) {
        double wordLength = word.length();
        sum += wordLength;
        count++;
    }
    final double average = sum / count;
    List<String> list = Arrays.stream(words).filter(s -> s.length()>= average).collect(Collectors.toList());
    // Create a list with words containing digits
    final List<String> wordsContainingDigits = list.stream()
        .filter(w -> w.matches(".*\\d+.*"))
        .collect(Collectors.toList());
    // Remove all the words that contain
    // digits from the initial list
    IntStream.range(0, wordsContainingDigits.size() - 1)
        .forEach(idx -> list.remove(idx));
    // Create the instance of a new list, which would
    // in future would be sorted.
    List<String> newList = new ArrayList<String>();
    // Fill the new array with the words containing digits first,
    // and then with the other.
    Stream.of(wordsContainingDigits, list).forEach(newList::addAll);
    return newList;
}
Answer 2

Пишите свой компаратор.

  • Если оба слова содержат числа, то сравниваете по ним
  • Если только одно слово содержит число, то компаратор возвращает >0
  • Если оба слова без чисел, то сравниваете их как строки

При этом учтите, что если сравнивать числа как строки, то результат будет не правильны. Хотя вы не указали какой результат вам нужен

READ ALSO
Декомпиляция и обновление Android-приложения до Android M

Декомпиляция и обновление Android-приложения до Android M

Добрый день! Имеется старый проект QEMU for Android, который не обновлялся с 2010 года (то есть почти 8 лет)Соответственно, проект не имеет ни Runtime Permissions,...

261
Определить время, затраченное на запрос. Java

Определить время, затраченное на запрос. Java

Есть некая таблица с данными о работникахSLQ запрос выводит данные об определенных работниках

246