【问题标题】:Iterate through a List until a specific String and say the Line Number? [duplicate]遍历一个列表直到一个特定的字符串并说出行号? [复制]
【发布时间】:2016-03-29 05:28:01
【问题描述】:

这是我的列表示例:

List<String> l2 = new ArrayList<String>();
l2.add("Apple");
l2.add("Kiwi");
l2.add("Orange");

所以基本上我想遍历这个列表,直到它找到例如“橙色”,然后它会返回一个行号(在这个例子中是 3)。但我真的不知道该怎么做。任何人都可以帮助我吗?

【问题讨论】:

  • 到目前为止您尝试过什么?您当前的预期输出可以简单地使用 indexOf
  • 听起来很像一个简单的List.indexOf(Object o) + 1。如果您的列表已排序,您可以编写更快的搜索,例如二分搜索
  • 您要打印代码的行号还是列表中“Orange”的索引?对于行号,您可以使用new Exception().getStackTrace()[0].getLineNumber()

标签: java


【解决方案1】:

您需要一个 for 循环来遍历任何数组或列表。在这种情况下,作为一个数组列表,您将使用以下 for 循环遍历它

for(int x = 0; x < l2.size();x++){
    if(l2.get(x).equals("Orange")){
      // this is where the code will end up when it selects Orange
    }
}

l2.size() 方法获取 ArrayList 的整个大小,并且每次小于 Arraylist 大小时将 x 1 添加到 x。 if 语句将在找到 equals 参数中的 ArrayList 中的文本后立即停止,如果此时要添加、删除或执行某些操作,则应将代码放置在此处。

【讨论】:

  • 只使用List.indexOf(Object o) 要容易得多。在这种情况下,它将是 int index = l2.indexOf("Orange");
  • 谢谢,我不知道。
【解决方案2】:

在遍历列表时有很多方法可以做到这一点。这是一个例子:

int i = 0;
for( String s : l2){
    if(s.equals("Orange")) System.out.println(i);
    i++;
}

【讨论】:

  • 这将打印List中“Orange”的索引,不一定是l2.add("Orange")所在的行号
  • 我不相信这是 OP 所要求的。如果我错了,请纠正我。
  • foreach 不是有效关键字,它被称为 for-each 循环,但使用相同的 for 关键字。另请注意,这是 for-each 循环的错误用法,在这种情况下您应该只使用普通的 for 循环
  • @peggy 如果 OP 正在寻找 literal 程序行号,预期结果将是 4(或更大 - 一旦包含此代码所在的类)而不是 3正如 OP 提供的那样
  • for-each 循环被设计为干净并隐藏迭代器。如果您要使用索引,则更常见的是使用带索引的 for 循环。 Check this answer。总体而言,使用 for-each 循环意味着您不关心索引
【解决方案3】:

做了一些研究,发现了一个更简单的方法: int indexOf(对象o) 返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。

【讨论】:

  • @phflack 实际上在 10 分钟前的评论中提供了这个,但很高兴你无论如何都想通了。
  • @DoubleDouble 将其作为一个答案,使其更易于查看。我没有看到他的评论。
  • @DoubleDouble 实际上是 luk2302 建议的 first
  • @Lankymart 感谢您的澄清。
  • 我确实认为无论是谁因为“别人优先”而否决了答案,这太荒谬了,我或多或少只是想指出,有时人们应该注意 cmets.. 如果他们真的想要以获得答案点,他们会将其作为答案发布。
猜你喜欢
  • 1970-01-01
  • 2018-09-17
  • 2021-06-30
  • 2014-06-28
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
相关资源
最近更新 更多