2016-10-31 3 views
0

Для класса мне нужно выполнить многопоточную сортировку в текстовом файле. В частности, мне нужно организовать слова по подсчету гласных, а затем по длине. Моя проблема заключается в сортировке массива по количеству гласных.Сортировка строк в ArrayList по количеству гласных

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

private static void vowelQueues(String[] words) { 

    Queue<String> noVowel = new LinkedList<String>(); 
    Queue<String> oneVowel = new LinkedList<String>(); 
    Queue<String> twoVowel = new LinkedList<String>(); 
    Queue<String> threeVowel = new LinkedList<String>(); 
    Queue<String> fourVowel = new LinkedList<String>(); 
    Queue<String> fiveVowel = new LinkedList<String>(); 
    Queue<String> sixVowel = new LinkedList<String>(); 
    Queue<String> sevenVowel = new LinkedList<String>(); 
    Queue<String> eightVowel = new LinkedList<String>(); 
    Queue<String> nineVowel = new LinkedList<String>(); 
    Queue<String> tenVowel = new LinkedList<String>(); 

    char ch; 
    String vowelHolder = ""; 
    int numVowels = 0; 
    for (String word : words) { 


     for (int i = 0; i < word.length(); i++) { 
      ch = word.charAt(i); 
      if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') { 
       numVowels++; 
       if (numVowels == 1) { 
        oneVowel.add(word); 
        numVowels = 0; 
       } else if (numVowels == 2) { 
        twoVowel.add(word); 
        numVowels=0; 
       } else if (numVowels == 3) { 
        threeVowel.add(word); 
        numVowels=0; 
       } 
      } 
     } 
    } 


    System.out.print(oneVowel); //These are test output statements 
    System.out.print(twoVowel); 
    System.out.println(threeVowel); 

} 

Вопрос заключается в том, что все слова, содержащие гласный добавляется в очередь oneVowel, а остальные остаются пустыми. Я думаю, это связано с тем, что как только numVowels получает инкрементный раз, когда первый оператор if добавляет все слово в первую очередь.

Как бы сделать так, что он считается всех гласные в слове и затем добавляет его под соответствующую очередь?

ответ

2

Это происходит потому, что вы назначаете ноль переменной numVowels, когда какое-либо из условий истинно. Ваша переменная numVowels никогда не увеличивается, и всегда первое условие становится истинным. Таким образом, в очереди oneVowel добавляются только элементы.

for (String word : words) { 
    numVowels = 0; 
    for (int i = 0; i < word.length(); i++) { 
      ch = word.charAt(i); 
      if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') { 
       numVowels++; 
      } 
    } 
    if (numVowels == 1) { 
     oneVowel.add(word); 
    } else if (numVowels == 2) { 
     twoVowel.add(word); 
    } else if (numVowels == 3) { 
     threeVowel.add(word); 
    } 
} 
+0

Он хорошо работает, спасибо! Однако, у меня есть вопрос. Почему код не работает, если вы перемещаете numVowels из цикла for? –

+0

Из цикла for, который перебирает слова? Думаю об этом. Вы хотите подсчитать гласные для каждого слова, поэтому вам нужно каждый раз инициализировать переменную перед сканированием через слово. Если вы инициализируете его вне внешнего цикла, numVowels даст вам полные гласные, найденные по всем словам, а не только по слову. –

+0

А это имеет смысл. То, что я пытался сделать, когда я устанавливал vowelCount = 0 в операторах if. Как говорят мои учителя, java не делает ошибок; пользователь делает. Я делал все возможное, чтобы воплотить это, поэтому спасибо за исправление этой ошибки пользователя! –