【问题标题】:.contains only works if hardcoded.contains 仅在硬编码时有效
【发布时间】:2021-03-14 08:54:57
【问题描述】:

这是我的第一篇文章,如果有什么不同,请告诉我。

我一直在尝试创建一种在二维 ArrayList 中查找搜索词索引的方法。这是我想出的代码:

import java.util.List;

public class Searcher {
public static int Search(List<List<String>> csv, String term) throws TermNotFoundException{
    if (csv.get(0).contains(term)) {
        return csv.get(0).indexOf(term);
    }
    else {
        throw new TermNotFoundException("Term not found");
    }
}

我现在遇到的问题是,当我对出现在我正在查看的 ArrayList 中的搜索词进行硬编码时,它可以完美运行。当我尝试使用如上所示的术语变量时会出现问题。

我正在查看的特定 ArrayList ( csv.get(0) ) 如下:

[日期时间_UTC,E1A,E1B,E1C,E2A,E2B,E3A,E3B,E3C,E3D,E4A,G1A,G2A,G2C,Zon]

因此,如果我在“E1A”中硬编码,它会找到它并返回 1。如果我在 main 方法中调用该函数并为变量项填写相同的内容,这将不起作用。

我有什么遗漏吗?

编辑:详细说明,由于隐私原因,我不能透露完整的二维数组。不过,我可以向您展示更多信息。

有人建议不要搜索两次,所以我将代码更改如下:

import java.util.List;
public class Searcher {
public static int Search(List<List<String>> csv, String term) throws TermNotFoundException{
    System.out.println(csv.get(0));
    System.out.println(term);
    int result = csv.get(0).indexOf(term);
    if (result != -1){
        return result;
    }
    else {
        throw new TermNotFoundException("Term not found");
    }
}

同样的问题发生了。包括一些调试行,这里是输出:

[datetime_UTC, E1A, E1B, E1C, E2A, E2B, E3A, E3B, E3C, E3D, E4A, G1A, G2A, G2C, Zon]
E1A
TermNotFoundException: Term not found
at Searcher.Search(Searcher.java:12)
at Main.main(Main.java:10)

如果有帮助的话。这是我调用函数的地方:

import java.io.FileNotFoundException;
import java.util.List;


public class Main {

public static void main(String[] args) throws FileNotFoundException {
    List<List<String>> csv = CSVReader.Read("standard_profiles.csv");
    try {
        System.out.println(Searcher.Search(csv, "E1A"));
    } catch (TermNotFoundException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 几个注意事项:你只检查csv.get(0),其他列表呢?你先做contains 然后indexOf,这是在做两次搜索字符串的工作。而且在列表中搜索很昂贵(O(n))。相反,只需在没有contains 的情况下执行indexOf,如果返回-1,则找不到。
  • 我几乎不怀疑这种方法在动态String 中无法正常工作,它看起来正确。投票结束,因为不可复制。您将不得不分享更多信息。例如带有输出的两个版本(硬编码字符串和动态字符串)的minimal reproducible example(强调完成)。
  • 最好的办法是使用调试器单步执行代码,或者在方法的开头添加System.out.println(term);。我的猜测是,出于某种原因,您发送的值不是您认为的那样。

标签: java string arraylist


【解决方案1】:
public static void main(String[] args) throws Exception {
    List<String> list=new ArrayList<>();
    list.add("000");
    List<List<String>> listList=new ArrayList<>();
    listList.add(list);
    System.out.println(Search(listList, "000"));;
}

以上代码返回 0,我无法重现您的问题。但是,如果您的术语不在第一个列表中,则它将不起作用,因为.get(0)意味着您只在List&lt;List&gt; 中搜索第一个List

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多