如何在Java中获取数组中的特定字符串值

3
String [] array=new String[7];

array[0]="a";
array[1]="b";
array[2]="c";
array[3]="d";
array[4]="e";
array[5]="f";
array[6]="g";

for (int i=0;i<array.Length;i++){
  if(array[i].equals("b")) {
        // check array from the first one and when it is "b" starts
        // to print the string value till "e"
        System.out.println(array[i]);
    }
    if (array[i].equals("e"))
        break;
}

我有一个字符串数组,希望在遇到“b”时打印所有字符串值,并在遇到“e”时停止。

有没有什么方法可以做到这一点?

我期望的结果是:

b
c
d
e

5
你填充数组的方式很糟糕,最好使用new String[]{"a","b","c", ....} - Lino
1
array.Length(L大写)也不是有效的Java。 - Lino
@Lino 严肃点,兄弟。我只是在写一个演示而已,当然不是我的实际代码。哈哈 - Jason WEI
3
@JasonWEI,我很认真。您应该提供可以编译的演示代码,以便其他人可以复制并可能再现您的问题。这个网站不是“我有问题,请帮忙”的网站,因此您还应该为我们提供一些可供使用而无需进一步解释的东西。 - Lino
1
@Lino,“{"a", "b", "c", ...}”(作为一个数组初始化器)不那么可怕:) - Andrew Tobilko
显示剩余2条评论
5个回答

3

一个Java-9的解决方案如下:

Arrays.stream(array)
      .dropWhile(e -> !"b".equals(e))
      .takeWhile(e -> !"f".equals(e))
      .forEach(System.out::println);

光荣,但由于额外的开销,可能非常低效 :) - Lino
2
@Lino dropWhiletakeWhile()通常是在顺序管道上进行的廉价操作。除非另有通知,否则我不会担心性能问题。 - Ousmane D.
当然,对于这个小数据集来说,这个方法非常有效,但是当1)数据源更大,2)条件永远不匹配(例如没有所需元素)时,它可能会出现问题。 - Lino

3
List<String> list = Arrays.asList(array);

list.subList(list.indexOf("b"), list.indexOf("e") + 1)
    .forEach(System.out::println);

假设数组(1)中同时存在"b"和"e",且"e"在"b"之后 (2)。

1
我原本想使用 String.substringString.join("", array) 实现这个操作,不过核心思想是一样的。 - AxelH
1
创建一个 new ArrayList<>() 是不必要的,可以省略。 - Lino

2
只需找到起始和结束索引,然后迭代即可 -
List<String> arrList = Arrays.asList(arr);
int indexOfB = arrList.indexOf("b"); 
int indexOfE = arrList.indexOf("e");
for(int i =indexOfB; i<=indexOfE; i++){
    System.out.println(arr[i]);
}

ArrayUtils 不属于标准的 Java 语言,或许可以添加一个指向 Apache Commons 的链接。 - Lino
1
我很确定你可以使用提供这种方法的库从indexOfBindexOfE获得数组的子集,而不是使用循环。 - AxelH
我建议的是(但不使用第三方库)只返回翻译后的文本。 - Andrew Tobilko
@DerickDaniel,现在它和我的一样了 :) 不过你好像执行了两次 Arrays.asList(arr) - Andrew Tobilko
@Andrew,已经更正了,之前没有看到你的回答 :) - Derrick
显示剩余2条评论

1

你可以使用一个标志来知道是否已经找到了第一个出现位置,以此来确定是否需要打印当前值。

String[] array = {"a", "b", "c", "d", "e", "f", "g"};

boolean toPrint = false;

for (int i = 0; i < array.length; i++) {
    if(array[i].equals("b")) //Find `b`, flag fo printing
        toPrint = true;

    if(toPrint) 
        System.out.println(array[i]);

    if (array[i].equals("e")) //Find `e`, break the loop
        break;
}

当开始出现时,这将简单地将布尔值设置为true,并打印每个值,直到找到第二个值。然后它将打破循环。

0

您可以在变量中找到并保存“b”的索引,同样的方法也适用于“e”,之后比较if(indexB <= indexE),如果为真,则打印从b到e的所有内容。

编辑:

public static void main(String[] arg) {

    String[] array = new String[]{"a", "b", "c", "d", "e", "f", "g"};

    bigFor: for (int i = 0; i < array.length; i++) {

        if (array[i].equals("b")) {

            for(int x = i; x < array.length; x++) {

                System.out.println(array[x]);

                if(array[x].equals("e")) {

                    break bigFor;

                }   
            }   
        } 
    }
}

1
这可能会很慢,因为您必须先迭代数组两次以查找索引,然后再进行打印。 - Lino
我知道,但对于初学者来说,这是最简单和安全的方法。 - KunLun
学习一个错误的方法从一开始就不会有什么帮助,为何不从一开始就用正确的方法做呢? - Lino
没有什么不好的。你可以提高自己的知识水平,逐渐掌握编写高效代码的技能。 - KunLun
1
是的,这是一个糟糕的逻辑,因为这个逻辑在“this works”处停止了。既然你正在迭代一个数组以查找第一个值,那就继续寻找第二个值。那么,为什么要使用布尔值根据读取的值来打印?请参阅此解决方案,该解决方案使用了您的逻辑但进行了改进。 - AxelH
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接