在字符串中打印字符的位置

时间:2017-05-10 18:19:24

标签: java arrays string

我有一个方法打印给定字符串中给定字符的索引。如果String不包含给定字符,则结果为-1。 我的代码如下所示:

public static int strpos(String text, char z) {

    int x = 0;

    char[] array = text.toCharArray();
    for (int i = 0; i < array.length; i++) {
        if (array[i] == z) {
            x = i;
            break;
        } else {
            x = -1;
        }
    }
    return x;
}

public static void main(String[] args) {
    System.out.println(strpos("abcdefghc", 'c'));
}

在这种情况下,结果是 2 ,如果我删除 break ,结果是 8 。我如何使用我的代码来获得2和8的结果?

3 个答案:

答案 0 :(得分:0)

您只需返回一次即可获得两者的结果 但是,您可以返回ArrayList<Integer> 您需要:

  • 初始化函数开头的列表。
  • 每当您找到一个号码,而不是打破时,add就是您的列表。
  • 完成搜索后,返回列表。

这就是如何轻松返回多个值的方法。

另外,为什么还有呢?

答案 1 :(得分:0)

一种解决方案是将索引存储在List<Integer>中并更改方法以返回它:

public static List<Integer> strpos(String text, char z) {
    List<Integer> indices = new ArrayList<>();

    char[] array = text.toCharArray();

    for (int i = 0; i < array.length; i++) {
        if (array[i] != z) {
            continue;
        }

        list.add(i);
    }

    return indices.isEmpty() ? Arrays.asList(-1) : indices;
}

答案 2 :(得分:0)

您可以将返回类型更改为List<Integer>并收集列表中的所有匹配索引(或您选择的其他集合)。 在这种情况下,不是使用-1作为特殊值来表示字符串中不存在字符,而是返回空列表, 自然。

以下是实现这一目标的一种方法:

List<Integer> strpos(String text, char z) {
    return IntStream.range(0, text.length())
            .filter(i -> text.charAt(i) == z)
            .boxed()
            .collect(Collectors.toList());
}

或者,没有Java 8流,但受益于.indexOf

List<Integer> strpos(String text, char z) {
    List<Integer> indexes = new ArrayList<>();
    int index = -1;
    while (true) {
        index = text.indexOf(z, index + 1);
        if (index == -1) {
            break;
        }
        indexes.add(index);
    }
    return indexes;
}