2014-12-15 3 views
4

У меня есть файл, который выгружает каждую строку в позицию в ArrayList, и я хочу, чтобы пользователь мог сортировать список только с линиями, имеющими определенное количество слов , Я не могу понять, как заставить его распечатать оставшийся список (правильных нумерованных записей).Сортировка списка строк по количеству слов

Начинает с поиска первого слова в списке, затем он выполняет итерацию через CharSequence и проверяет, равен ли символ пробелу: «Если это так, то он увеличивает nWords на 1 и если nWords не равно userInput (номер, который пользователь вводит для сортировки списка по количеству слов), он должен удалить этот элемент из списка.

ArrayList<CharSequence> str = new ArrayList(); 
str.add("Hello"); 
str.add("Hi there"); 
str.add("toad"); 
str.add("i see you"); 

System.out.println("How many words?"); 
Scanner scan = new Scanner(System.in); 
int userInput = scan.nextInt(); 

for (int loopNumber = 0; loopNumber < str.size();) { 
    int nWords = 1; 
    for (int i = 0; i < str.get(loopNumber).length(); i++) { 
     if (str.get(loopNumber).charAt(i) == ' ') { 
      nWords++; 
      if (nWords != userInput) { 
       str.remove(loopNumber); 
      } 
     } 
    } 
    loopNumber++; 
} 
+0

Подсчет чисел пробелов для определения количества слов чреват опасностью! Если вход содержит вкладки или двойной интервал, ваш счет будет неправильным. До тех пор, пока ваш текст написан на английском языке (в отличие от математики, табличных данных и т. Д.), Самым безопасным * простым * методом подсчета слов, вероятно, будет вызов 'line.split (« \\ s + »). Length' для каждой строки в документе. –

+0

Можно ли написать ожидаемый вывод примера ур? – OnePunchMan

ответ

0

Попробуйте что-то вроде этого ..... (метод сравнения не может быть наиболее эффективным!)

ArrayList<String> str = new ArrayList<String>(); 
    str.add("Hello"); 
    str.add("Hi there"); 
    str.add("toad"); 
    str.add("i see you"); 

    Comparator<String> stringComparator = new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      String [] words1 = null; 
      String [] words2 = null; 
      try { 
       words1 = o1.split(" "); 
       words2 = o2.split(" "); 
      } catch (Exception e) { 
       //ignore 
      } 

      if (words1 != null && words2 != null) { 
       if (words1.length > words2.length) { 
        return 1; 
       } else if (words1.length == words2.length) { 
        return 0; 
       } else { 
        return -1; 
       } 
      } else if (words1 != null) { 
       return 1; 
      } else { 
       return -1; 
      } 
     } 
    }; 

    Collections.sort(str, stringComparator); 
0

Вы можете использовать интерфейс Comparator. Проверьте ниже пример

import java.util.ArrayList; 
 
import java.util.Collections; 
 
import java.util.Comparator; 
 
import java.util.List; 
 

 
public class SortedList { 
 
\t public static void main(String[] args) { 
 
\t \t ArrayList<SimpleString> strArray = new ArrayList<SimpleString>(); 
 
\t \t strArray.add(new SimpleString("String")); 
 
\t \t strArray.add(new SimpleString("abc")); 
 
\t \t strArray.add(new SimpleString("Test String")); 
 

 
\t \t Collections.sort(strArray, new SimpleString("")); 
 

 
\t \t for (SimpleString str : strArray) { 
 
\t \t \t System.out.println(str.getTestString()); 
 
\t \t } 
 
\t } 
 
} 
 

 
class SimpleString implements Comparator<SimpleString> { 
 
\t String testString; 
 

 
\t public SimpleString(String testString) { 
 
\t \t this.testString = testString; 
 
\t } 
 

 
\t public String getTestString() { 
 
\t \t return testString; 
 
\t } 
 

 
\t public void setTestString(String testString) { 
 
\t \t this.testString = testString; 
 
\t } 
 

 
\t @Override 
 
\t public int compare(SimpleString o1, SimpleString o2) { 
 
\t \t // TODO Auto-generated method stub 
 
\t \t int strLength = o1.getTestString().length() 
 
\t \t \t \t - o2.getTestString().length(); 
 
\t \t return strLength; 
 
\t } 
 
}

2

Вам не нужно сортировать. Вам нужно удалить эти строки без правильного количества слов.

для решения этой задачи, Iterator это оружие выбора, потому что вы можете вызвать его метод remove()в то время как итерация:

for (Iterator<String> i = str.iterator(); i.hasNext();) { 
    if (i.next().split(" +").length != userInput) 
     i.remove(); 
} 

Это все есть на него.

Также обратите внимание на значительно более сжатый способ подсчета слов с помощью метода split().

Смежные вопросы