首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找价值,继续前行

寻找价值,继续前行
EN

Stack Overflow用户
提问于 2020-03-28 00:39:03
回答 3查看 57关注 0票数 2

我有一个有项目列表的程序。

然后我搜索一个字符串,并尝试在所述列表中找到它。

我希望发生的是:它找到第一个匹配项,然后将其打印出来或保存在某个地方,以便我以后可以使用它(例如,通过突出显示用户选择)。然后,一旦我再次搜索相同的字符串,它应该返回第二次出现,然后是第三次,依此类推。当它没有找到更多的出现时,它应该回到开始处并重复它。

这是我所拥有的一个简单的例子:

代码语言:javascript
复制
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;
            }

        }

    }

我在if中添加了break,所以我只能得到第一个结果。如果我删除它,我会得到所有的结果。

在程序中,我有与点击按钮相关的类似代码,如果列表包含用户搜索的内容,则突出显示用户选择,这只是一个示例。

在我的程序中,只有第一个结果会突出显示(因为我跳出了循环),或者只有最后一个结果会突出显示(因为我没有跳出循环)。

我如何才能让搜索从它停止的地方继续,正式地忽略它已经获得的结果呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-28 02:06:34

正如@Alex在他的回答中指出的那样,你应该使用iterator,并将你的结果保存在一个私有的ArrayList中,以便进一步使用这些搜索结果。

如果您不熟悉iterator,请使用this

我已经编写了一个简单的类HighlightingUserInput,它的行为与您的条件相同。它会给出第一个搜索结果,并打印出来并保存在ArrayList中,如果你没有退出程序(或者你可以添加一个搜索按钮,如果用户再次按下搜索按钮),然后给出第二个搜索结果,依此类推。

请随时询问与以下程序相关的任何问题。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-03-28 00:52:21

您可以遍历列表,每次找到字符串时,都可以调用您的方法来突出显示它。或者,如果你想在每次调用你的方法时都能得到1到1的字符串,那么你可以使用迭代器。在第一次调用您的方法时,您将获得列表的迭代器,并将其存储在类的私有字段中。在后续调用中,您可以使用此迭代器从列表中获取下一个匹配的字符串。

票数 1
EN

Stack Overflow用户

发布于 2020-03-28 01:07:28

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60890328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档