【问题标题】:Having problems with a search method between Arrays and Array lists数组和数组列表之间的搜索方法有问题
【发布时间】:2015-08-19 19:57:00
【问题描述】:

好的,所以我正在尝试设计一个简单的程序来检查长度为 4 个字符的子字符串是否在所有初始字符串中。这是我的代码如下:

public class StringSearch{
private String[] s1Array = {"A","C","T","G","A","C","G","C","A","G"};
private String[] s2Array = {"T","C","A","C","A","A","C","G","G","G"};
private String[] s3Array = {"G","A","G","T","C","C","A","G","T","T"};
//{for (int i = 0; i < s1Array.length; i++){
//    System.out.print(s1Array[i]);
//}}//check if Array loaded correctly
/**
 * This is the search method.
 * 
 * @param  length   length of sub string to search
 * @param  count    counter for search engine
 * @param  i        for-loop counter
 * @return subStr   returns strings of length = 4 that are found in all 3 input strings with at most 
 *                  one mismatched position.
 */
public String Search()
{
    int length = 4;
    int count = 0;
    int i = 0;
    ArrayList<StringSearch> subStr = new ArrayList<StringSearch>();
    //String[] subStr = new String[4];
    do
    {
    for (i = count; i < length; i++){
        subStr.add(s1Array[i]); // cant find .add method???
        count = count + 1;
    }
    if (s2Array.contains(subStr) && s3Array.contains(subStr)){ //can't find .contains method???
        System.out.println(subStr + "is in all 3 lists.");
    }
    if (count = s1Array.length){
        System.out.println("Task complete.");
    }
    else{
        count = count - length;
        count = count + 1;
    }
    }while (count <= s1Array.length);
}

}

由于某种原因,Java 似乎找不到 .add 或 .contains 方法,我不知道为什么。所以我的方法是将每个初始字符串转换为一个数组(因为指定的每个字符串的分配正好是 N 个元素长,在这种情况下 N = 10),其中 1 个字母将是 1 个元素。接下来我设置了一个 for 循环,它将扫描 s1Array 并将前 4 个元素添加到用于搜索 s2Array 和 s3Array 的 ArrayList subStr。无论出于何种原因,这都是 .add 不是有效方法的地方。将其注释掉并再次编译,我还遇到了 .contains 方法不是有效方法的问题。为什么这行不通?我错过了什么?从逻辑上讲,这似乎是有道理的,但我想也许我在语法中遗漏了一些东西?我们将不胜感激,因为我是 Java 新手。

【问题讨论】:

  • ArraysArraylists 在 Java 中是完全不同的数据类型。
  • .add 和 .contains 是 ArrayList 类的一部分。 subStr.add(s1Array[i]);不会工作,因为 subStr 被定义为 而 s1Array 被定义为 String
  • 有关 ArrayList 的更多信息,请参阅 docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

标签: java arrays search arraylist


【解决方案1】:

这里有很多错误和误解。

让我们从#1

开始
private String[] s1Array = {"A","C","T","G","A","C","G","C","A","G"};

创建一个字符串数组很傻,你应该使用单个字符串或字符数组。

private String s1 = "ACTGACGCAG";

或者

private char[] s1Array = {'A','C','T','G','A','C','G','C','A','G'};

现在#2

ArrayList<StringSearch> subStr = new ArrayList<StringSearch>();

这意味着您正在尝试创建一个包含 StringSearch 类型对象的 ArrayList。 StringSearch 是一个包含三个数组和 Search 函数的类,所以我认为这不是你想要的。

如果你想列出 3 个字符串,你可以这样做:

ArrayList<String> stringList = new ArrayList<String>();
stringList.add(s1);
stringList.add(s2);
stringList.add(s3);

现在假设您将 s1、s2 和 s3 定义为字符串,您可以执行以下操作。

for(int i = 0; i <= s1.length() - 4; i++)
{
    String subStr = s1.substring(i, i + 4);
    if(s2.contains(subStr) && s3.contains(subStr))
    {
        System.out.println(subStr + " is in all 3 lists.");
    }
}
System.out.println("Task Complete.");

上面的代码应该实现你想要做的事情。但是,应该注意的是,这不是最有效的方式,只是一种方式。根据目前的代码判断,您应该从一些更基本的概念开始。

【讨论】:

  • 我真的很喜欢这种方法!感谢您花时间分解它。我没有具体说明我试图对这个特定项目做的所有事情,而是我想用我到目前为止所做的事情做些什么。最终产品将能够使用 4 个字符的子字符串检查每个字符串,以查看是否可以在所有 3 个原始字符串中找到 subString 并匹配至少 3/4 个字母。例如,如果我们以“ACTG”作为子字符串开始,那么“AATG”、“ACAG”、“TCTG”将是我正在搜索的有效示例。正是出于这个原因,我使用数组/列表来检查每个字母。
  • 这种方法仍然有效。只需使用 s1.charAt(index);比较单个字母。
  • 有没有办法仅使用字符串来实现这一点,或者我在将其分解为数组和列表方面是否走在正确的轨道上?我相信你可以说,我是一个完整的 Java 新手。这种语言的语法让我有些困惑。我的大脑知道它想让程序做什么,但我很难用 Java 能理解的术语来表达。
  • 嗯,好的,我试试看。谢谢
  • 当然,如果您觉得我已经满意地回答了您的问题,请接受答案。 :)
【解决方案2】:

在将 subStr 声明为 ArrayList 后,您可以调用 add 或 contains,仅使用 StringSearch 对象作为参数。

【讨论】:

    【解决方案3】:

    代替:

    ArrayList<StringSearch> subStr = new ArrayList<StringSearch>();
    

    替换为:

    String subStr = "";
    

    并在 for 循环中将 s1 中的前 4 个字母放在它自己的字符串 (subStr) 中,添加以下行:

    subStr += s1Array[i];
    

    另外,s1Array 是一个字符串数组,而不是一个字符串。 .contains 方法是属于字符串变量的方法,例如。你实现它的方式,你可以说 s1Array[i].contains。但是你不能说 s1Array.contains。如果您将 String 数组更改为 Strings 并编辑您的代码以适应,一切都应该按照您期望的方式工作。

    【讨论】:

    • 没问题:)。此外,如果您没有找到您正在寻找的函数(例如 .contains()),那么您应该检查 String API 以了解如何使用它。请始终检查 API 哈哈。
    【解决方案4】:

    首先,您需要了解 Java 泛型的概念。 泛型最基本的一点是,一旦你声明了一个集合,这里就是数组列表,因为你只能添加 StringSearch 的对象。
    其次,从逻辑上讲,您可以做的是实现一种称为 Longest Common Subsequence.成对检查数组上最长的子序列是否为4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2011-01-11
      • 2021-10-08
      • 2015-02-12
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多