使用子字符串对数组中的元素进行索引

Posted

技术标签:

【中文标题】使用子字符串对数组中的元素进行索引【英文标题】:Index of a element in array using substring 【发布时间】:2015-12-03 20:36:33 【问题描述】:

我需要获取要搜索的数组中元素的索引:

 String[] items = "One:10.1.22.33", "Two:10.1.21.23", "Three:10.1.21.33", "Four:10.1.21.23", "Five:10.1.22.23";
 String q = "Two";  //need to find index of element starting with sub-sting "Two"

我尝试过的

试一试

    String temp = "^"+q;    
    System.out.println(Arrays.asList(items).indexOf(temp));

Try-2

items[i].matches(temp)
for(int i=0;i<items.length;i++) 
    if(items[i].matches(temp)) System.out.println(i);

两者都没有按预期工作。

【问题讨论】:

matches 尝试匹配整个字符串。如果您想使用matches,则必须使用"^" + q + ".*" 或类似的东西。 (您可能还想将q 包装在Pattern.quote 中。) 感谢它为 items[i].matches 工作,但不适用于 .indexof 什么意思?如果您使用temp = "Two.*",则应打印1。不是吗? (String.indexOf 只能用于 String,而不是字符串列表。) 等等,为什么不用多维数组呢? @aioobe 谢谢伟大的信息 【参考方案1】:
String q= "Five";String pattern = q+"(.*)";
for(int i=0;i<items.length;i++)

if(items[i].matches(pattern))
  
  System.out.println(i);
 

【讨论】:

对于 try-2 你应该使用 q +"(.*)" 。它将为 q 的索引提供任何字符 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。【参考方案2】:

我认为您需要为此实现 LinearSearch,但稍有不同的是,您正在搜索 substring。你可以试试这个。

String[] items = "One:10.1.22.33", "Two:10.1.21.23", "Three:10.1.21.33", "Four:10.1.21.23", "Five:10.1.22.23";
String q= "Two";  //need to find index of element starting with sub-sting "Two"

for (int i = 0; 0 < items.length; i++) 
    if (items[i].startsWith(q))
        // item found
        break;
     else if (i == items.length) 
        // item not found
    

【讨论】:

【参考方案3】:

你最好像这样使用startsWith(String prefix)

String[] items = "One:10.1.22.33", "Two:10.1.21.23", "Three:10.1.21.33", "Four:10.1.21.23", "Five:10.1.22.23";
String q = "Two";  //need to find index of element starting with substring "Two"
for (int i = 0; i < items.length; i++) 
    if (items[i].startsWith(q)) 
        System.out.println(i);
    

您的第一次尝试不起作用,因为您试图在列表中获取字符串 ^Two 的索引,但 indexOf(String str) 不接受正则表达式。

您的第二次尝试不起作用,因为matches(String regex) 对整个字符串起作用,而不仅仅是在开头。

如果您使用的是 Java 8,您可以编写以下代码,返回以 "Two" 开头的第一项的索引,如果没有找到则返回 -1。

String[] items = "One:10.1.22.33", "Two:10.1.21.23", "Three:10.1.21.33", "Four:10.1.21.23", "Five:10.1.22.23";
String q = "Two";
int index = IntStream.range(0, items.length).filter(i -> items[i].startsWith(q)).findFirst().orElse(-1);

【讨论】:

谢谢。我们可以在没有循环的情况下获得索引吗?? @Ravichandra 要获取索引,您将不得不循环。如果您使用的是 Java 8,则可以将其隐藏在 Stream 中。

以上是关于使用子字符串对数组中的元素进行索引的主要内容,如果未能解决你的问题,请参考以下文章

linq 按子字符串对数组中的字符串进行排序

搜索子字符串的数组元素并返回索引

使用负索引从pyspark字符串列的最后一个索引中对多个字符进行子字符串

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

从嵌套列表的子数组返回元素的索引

Arrays and -contains - 测试数组元素中的子字符串