Сортировка String по количеству гласных букв

438
26 ноября 2016, 19:15

В общем, мне нужно подсчитать количество гласных букв в n введенных строках и отсортировать их по возрастанию\убыванию. Для этого, я сначала перевел String в Char, где пробежался по всем буквам и поставил счетчик, который подсчитывает кол-во гласных букв. Далее, обратно упаковал Char в String и тут мне нужно сделать сортировку, не могу разобраться как ее сделать, подскажите :)

import java.util.Scanner;
public class projFour {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int row_val = 0, g = 1, localvar = 0;
        String temp;
        System.out.print("Enter row value: ");
        if(input.hasNextInt()){
            row_val = input.nextInt();
        }
        String[] a = new String[row_val + 1];
        String[] c = new String[row_val + 1];
        System.out.println("Enter " + row_val + " lines");
        for (int i = 0; i < row_val + 1; i++){
            if (input.hasNextLine()){
                a[i] = input.nextLine();
            }
        }
        char[] vowels = {'a','o','i','y','u','e'};
        for (int i = 1; i < row_val + 1; i++) {
            char[] chars = a[i].toCharArray();
            int k = 0;
            for (int j = 0; j < chars.length; j++){
                for (int x = 0; x < vowels.length; x++) {
                    if (chars[j] == vowels[x]) {
                        k++;
                    }
                }
            }
            //System.out.println("Odd val = " + k);
            String b = new String(chars);
            c[g] = b;
            System.out.println("String ========= " + c[g]);
            if (localvar > k) {
                        temp = c[g - 1];
                        c[g - 1] = c[g];
                        c[g] = temp;
                        localvar = k;
            } else {
                        localvar = k;
            }
            g++;
        }
        for (int i = 1; i < row_val + 1; i++) {
            System.out.println("Sorted = " + c[i]);
        }
    }
}
Answer 1

Чтобы отсортировывать элементы по определенным критериям, не обязательно реализовывать алгоритм сортировки, достаточно написать лишь свой компаратор. Это делается очень просто:

// функция возвращающая количество гласных букв
Function<String, Integer> getCount = new Function<String, Integer>() {
        // коллекция содержащая гласные буквы
        private Set<Character> set = new HashSet<>(Arrays.asList('а', 'е', 'у', 'ы', 'о', 'я'));
        @Override
        public Integer apply(String s) {
            int count = 0;
            for (int i = 0; i < s.length(); i++)
                count += set.contains(s.charAt(i)) ? 1 : 0;
            return count;
        }
    };
Comparator<String> comparator = (s1, s2) -> Integer.compare(getCount.apply(s1), getCount.apply(s2));
List<String> stringList = Arrays.asList("ааа", "я", "вв");
// сортировка по возврастанию частоты гласных букв
// если требуется обратный порядок то нужно написать comparator.reversed()
Collections.sort(stringList, comparator);
READ ALSO
Добавление кнопки currentLocation

Добавление кнопки currentLocation

В google maps хочу реализовать кнопку myCurrentLocationВ методе onCreate добавил следующее:

245
Обновление сервера Intellij idea

Обновление сервера Intellij idea

В intellij ideа, когда запущен сервер, я нажимаю обновить и табличка "Restart server" "Redeploy server", оба пересобирают артифактыМожно ли как-то обновить проект,...

265
ActionListener: данные из двух класов

ActionListener: данные из двух класов

Новичок в SWING просит помощи

283
Параметры в методах

Параметры в методах

Помогите разобраться, пожалуйста

250