Список строковых массивов с использованием сканера - PullRequest
0 голосов
/ 09 мая 2020

Edit: добавлены фигурные скобки {} и скриншот Eclipse

У меня проблема с простым назначением для создания класса, который имеет список массивов для хранения слов из командной строки, с добавлением каждого слова до конца списка массивов, затем выполните поиск в списке указанного c слова ("the") и распечатайте местоположение вхождений слова, а также другой метод для возврата нового списка массивов со словами в позициях, указанных номер.

Я написал код ниже. В Eclipse IDE он не показывает никаких ошибок, но когда я попытался запустить код с помощью Run Configurations и ввести этот фиктивный текст: «Быстрая коричневая лиса перепрыгивает через ленивую собаку. Быстрая коричневая лиса перепрыгивает через ленивую собаку. Быстрая коричневая лисица перепрыгивает через ленивую собаку. ", Не получается. Не знаю почему, не могли бы вы дать мне совет? Спасибо!

import java.util.ArrayList;
import java.util.Scanner;
class Search {
    ArrayList<String> list;

    public Search(){
        list = new ArrayList<String>();
    }

    public void read(){
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()) {
            list.add(scanner.next());
        }
        scanner.close();
    }

    public void find(String word){
        for(int i = 0; i < list.size(); i++) {
            if(list.get(i).equalsIgnoreCase(word)) {
                System.out.println(i);
            }
        }
    }

    public ArrayList<String> subsequence(int[] positions){
        ArrayList<String> result = new ArrayList<String>();
        for(int i = 0; i < positions.length; i++) {
            if(positions[i] >= 0 && positions[i] < list.size()) {
                result.add(list.get(positions[i]));
            }   
        }
        return result;
    }

    // Testing method within class again
    public static void main(String[] args){
        Search search = new Search();
        search.read();
        search.find("the");
        for(String s : search.subsequence(new int[]{0, 3, 4}))
            System.out.println(s);

    }
}  

Eclipse screenshot

1 Ответ

1 голос
/ 09 мая 2020
  • Как прокомментировал уважаемый @Chris, пожалуйста, используйте фигурные скобки при кодировании. Я запустил ваш код двумя разными способами и получил результат.

  • Первый способ

  • Если вы хотите используйте scanner.hashNext() с while, тогда вы должны изменить свои main() и read() вот так

    public static void main(String[] args) {
        Search search = new Search();
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        sc.close();
        search.read(line);
        search.find("the");
        for (String s : search.subsequence(new int[] { 0, 3, 4 })) {
            System.out.println(s);
        }
    }
    
    public void read(String line) {
            Scanner scanner = new Scanner(line).useDelimiter("\\s");
            while (scanner.hasNext()) {
                list.add(scanner.next());
            }
            scanner.close();
    }
    
    
  • Простой сканер текста, который может анализировать примитивные типы и строки с использованием регулярных выражений.
  • A Scanner разбивает ввод на токены с использованием шаблона разделителя, который по умолчанию соответствует пробелам. Затем полученные токены можно преобразовать в значения разных типов с помощью различных следующих методов.

  • Методы next() и hasNext() и их сопутствующие методы примитивного типа сначала пропускают любой ввод который соответствует шаблону разделителя, а затем попытается вернуть следующий токен. И hasNext(), и next() могут блокироваться в ожидании дальнейшего ввода. Независимо от того, не связан ли блок hasNext() с тем, будет ли блокироваться связанный с ним следующий метод.

  • Второй путь

  • Если вы хотите использовать StringTokenizer, вам нужно будет изменить только read() на существующий код.

    public void read(String line) {
        Scanner scanner = new Scanner(System.in);
        StringTokenizer st = new StringTokenizer(scanner.nextLine(), " ");
        while (st.hasMoreElements()) {
            list.add(st.nextElement().toString());
        }
        scanner.close();
    }
    
  • Всегда лучше использовать StringTokenizer для строка. Класс StringTokenizer позволяет приложению разбивать строку на токены.

  • Объект StringTokenizer внутренне поддерживает текущую позицию в строке, которую нужно токенизировать. Некоторые операции продвигают эту текущую позицию за пределы обработанных символов. Токен возвращается путем взятия подстроки строки, которая использовалась для создания объекта StringTokenizer.

Ссылка : Сканер и StringTokenizer

...