Ищите ценность и продолжайте идти

У меня есть программа, в которой есть список предметов.

Затем я ищу строку и пытаюсь найти ее в указанном списке.

Я хотел бы, чтобы это произошло: он находит первое вхождение, затем распечатывает его или сохраняет где-то, чтобы я мог использовать его позже (например, выделив выбор пользователя). Затем, как только я снова ищу ту же строку, он должен вернуть мне второе вхождение, затем третье и т. Д. Когда он не находит больше вхождений, он должен вернуться к началу и повторить его.

Это грубый пример того, что у меня есть:

public static void main(String[] args) {

        ArrayList<String> exampleList = new ArrayList<String>();

        exampleList.add("string1");
        exampleList.add("john");
        exampleList.add("string2");
        exampleList.add("arnold");
        exampleList.add("string3");

        String inputExample = "str"

        for (String s : exampleList) {

            if (s.contains(inputExample)) {

                System.out.println(s);
                break;
            }

        }

    }

Я добавил break внутри if чтобы получить только первый результат. Если я удалю его, я получу все результаты.

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

Что происходит в моей программе, так это то, что будет выделен только первый результат (потому что я вышел из цикла), или будет выделен только последний результат (потому что я не вышел из цикла).

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

Всего 3 ответа


Как отметил @Alex в своем ответе, вы должны использовать iterator и сохранять свои результаты в частном ArrayList для дальнейшего использования этих результатов поиска.

Если вы не знакомы с iterator используйте этот

Я написал простой класс HighlightingUserInput который ведет себя как ваши условия. Он выдает первый результат поиска, печатает его и сохраняет в ArrayList , если вы не вышли из программы (или можете добавить кнопку поиска, если пользователь снова нажал кнопку поиска), затем выдает второй результат поиска и т. Д.

Не стесняйтесь задавать вопросы, связанные с этой следующей программой.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class HighlightingUserInput{

   private static ArrayList<String> resultsString=new ArrayList<>();

   public static void main(String [] args) {

      ArrayList<String > allStrings=new ArrayList<>();

      allStrings.add("string1");
      allStrings.add("john");
      allStrings.add("string2");
      allStrings.add("arnold");
      allStrings.add("string3");

      Scanner scanner=new Scanner(System.in);

      CharSequence userIput=scanner.nextLine();

      Iterator iterator = allStrings.iterator();

      while(!scanner.nextLine().equals("exit")) {

         inner:
         while (iterator.hasNext()) {
            String s = (String) iterator.next();
            if (s.contains(userIput)) {
                System.out.println(s);
                HighlightingUserInput.resultsString.add(s);
                break inner;
            }

         }

         if(!iterator.hasNext())
             iterator = allStrings.iterator();


       }
   }

}

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


public static void main(String[] args) {

    ArrayList<String> exampleList = new ArrayList<String>();

    exampleList.add("string1");
    exampleList.add("john");
    exampleList.add("string2");
    exampleList.add("arnold");
    exampleList.add("string3");

    String inputExample = "str";
    int count = 0;
    while(count >= 0){
        System.out.println(customSearch(exampleList, inputExample, count);
        count ++;
        } // write break statement when count reaches to a particular value based on your use case

String customSearch(List<String> words, String searchKey, int count){
    List<String> searchedWords = words.stream().filter(word -> if word.toLowerCase().contains(searchKey.toLowerCase)).collect(Collectors.toList());
    return searchWords.get(count%searchedWords.size());

Есть идеи?

10000