在字符串数组中搜索子字符串?

3

我想在Java中写一个小方法,但是我无法弄清楚它。我想要做的是输入一个字符串,然后将一个整数变量的值设置为该数组中的索引,即如果我有一个由...组成的数组

[0] 'hi guys'
[1] 'this'
[2] 'is'
[3] 'sparta'

我的整数值设置为0,我想找到第一次出现的“ta”,它将是[3],所以我希望函数将我的整数设置为3。目前我完全不知道该怎么做,有没有简单的方法?我已经定义了一个名为get()的函数,它返回当前行的值(即在这种情况下,get(0)将返回“hi guys”)。请问有人能帮忙吗?谢谢!
 public void find(String line ) {
   boolean found = false;
   int i = cursor + 1;
   while ( found = false && i!=cursor) {
   if ((doc.get(cursor).indexOf( line ) > 0)){
  cursor = i;
  found = true;
   }else {
    cursor++;
    cursor%=doc.size();
    i++;

   }
 }
 }

这是作业吗?如果是的话,你应该标记它。 - Wipqozn
@steveom:你肯定陷入了困境,但为了帮助你,我们需要一些信息:你想要放入数组并搜索的文本数据来自哪里?目前doc是什么类型的对象?你是否试图读取文件? - Paul Sasik
@steveom:还有一些明显的错误和遗漏:found = false 应该是 found == false,你现在正在赋值而不是比较。我也没有看到你实际上在哪里搜索一个字符串中的子字符串...从你的例子中:找到第一个出现的 "ta" - Paul Sasik
@Paul Sasik,已经解决了等号问题。doc是我定义的一个类的实例,具有数组的所有基本功能。 - steveom
5个回答

2
通常我不这样做,但今天是星期六,我很开心,可能会喝醉。
public void find(String line ) {
   boolean found = false;
   int i = 0;;
   while (i < doc.size()) {
     if ((doc.get(i).indexOf( line ) > 0)){
       cursor = i;
       found = true;
       break;
     }else {
       i++;
     }
   }
   if (found) {
      // print cursor or do whatever
   }
 }

2
你需要注意是否这是一份作业。
一种方法是:
    int i = 0;
    String searchTerm = "ta";

    System.out.println("Following substrings contain search term:");
    for (String s : "hi guys,this,is,sparta".split(",")) {
        if (s.contains(searchTerm)) System.out.println(i++);
        else i++;
    }

如果你更喜欢使用正则表达式,那么将 s.contains(searchTerm) 替换为 s.matches(searchTerm)

如果这不是作业,而是面试问题或工作问题,那么这将变得非常复杂。例如:氨基酸序列是搜索术语,需要在DNA/RNA中查找它的位置。在这种情况下,您需要更复杂的解决方案。

示例:


1
如果我正确理解了您的任务,我会这样做:
public int find(String line, int startPosition) {
    if (doc[startPosition].contains(line) {
        return startPosition;
    }
    for (int i = 0; i < Math.max(doc.size() - startPosition, startPosition); i++) {
        if (startPosition - i > 0 && doc[startPosition - i].contains(line)) {
            return startPosition - i;
        }
        if (startPosition + i < doc.size() && doc[startPosition + i].contains(line)) {
            return startPosition + i;
        }

    }
    return -1;
}

这将返回包含作为行参数传递的子字符串的数组中第一个元素的索引。

这可能非常接近,但我认为OP需要对每一行进行子字符串搜索:从问题中,“找到第一个出现的“ta”,它是第3个示例条目的子字符串。” - Paul Sasik
是的,保罗,你说得对。我需要在每一行中搜索子字符串。我遇到的主要问题是,我有一个值,让我们称之为i,它指向数组,并且可能指向数组中间的位置,我想遍历数组并找到最接近i的索引,即子字符串存在的数组中的位置。抱歉,我之前没有表达清楚! - steveom
好的,我上面实现的是搜索子字符串,所以我不确定Paul在说什么。现在它返回了与作为参数传递的子字符串相对应的数组中的第一个索引,而似乎应该有另一个参数,并且索引应该是最接近该参数值的索引。在这种情况下,算法需要进行调整,我将适当地编辑我的原始代码。 - Alexander Finn
非常感谢你,亚历山大。我已经和我的班级运行了这段代码,它比我之前做的要干净得多,只需要稍微调整一下 :) 谢谢 :) - steveom

1
他说这不是作业,所以这就是:
(这实际上可以编译和运行)
    import java.io.*;

    public class A {
            public static void main(String[] args) {
                    String[] arr = {"hi guys", "this", "is", "sparta"};
                    System.out.println("enter substring:");
                    String substr = "";
                    try {
                    substr = new BufferedReader(new InputStreamReader(System.in)).readLine();
                    } catch(IOException e) {System.exit(0);}
                    for(int i =0; i<arr.length; i++) {
                            int charPos = arr[i].indexOf(substr);
                            if(charPos!=-1) {
                                    System.out.println("found in string index " + i + " at "+charPos);
                                    break;
                            }
                    }
            }
    }

0

在实际的字符串数组中搜索而不是每行搜索,这样不是更明智吗?

然后您可以循环遍历该数组,如果该位置处的字符串包含子字符串,则返回当前索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接