【发布时间】: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);。我的猜测是,出于某种原因,您发送的值不是您认为的那样。