如何比较单个字符串中的元素?

时间:2014-03-06 19:08:07

标签: java arrays string

当且仅当1和0并排重复多次时,我需要以1s和0s的字符串打印元素的索引。

例如: 输入:“0010011” 输出:“0,3,5”

重复从索引0,3和5开始。

这是我目前拥有的

Scanner keyboard = new Scanner(System.in);
    ArrayList runs = new ArrayList();


    System.out.println("Enter non empty string of 1s and 0s");
    String input = keyboard.nextLine();
    char[] array = input.toCharArray();

    for(int i = 0; i < input.length(); i++)
    {
        if(array[i] == array[i++])
        {
            runs.add(i);
        }

    }
    for(int i = 0; i<= array.length; i++)
    {
        System.out.println(runs);
    }

当我测试这个时,我尝试输入“00100”并获得“1,3,5”的输出。另一个测试输入来自“0010011”以上并获得“1,3,5,7”。它似乎是打印奇数,而不是数字开始重复的索引。谁能发现我做错了什么?我感觉它来自我在第一个for循环中的比较。

4 个答案:

答案 0 :(得分:2)

这应该有效:

Scanner keyboard = new Scanner(System.in);

System.out.println("Enter non empty string of 1s and 0s");
String input = keyboard.nextLine();
char lastChar = '~'

for(int i=0; i<input.length() - 1; i++) {
    if(input.charAt(i) == input.charAt(i + 1) && (i == 0 || input.charAt(i) != input.charAt(i - 1))) {
        System.out.println(i);
    }
}

答案 1 :(得分:1)

我可以指出有三个直接问题:

  • 首先是显而易见的。您正在使用i++,而您应该使用i + 1i++会增加i的值,因此您错过了下一次迭代的索引。
  • 其次,您应该迭代到input.length() - 2,否则当您访问最后一个索引的ArrayIndexOutOfBounds时,您将获得array[i + 1]例外。
  • 如果按顺序超过2 0's1's,您当前的逻辑将失败。它会打印01索引,例如00010

对于第三点,你应该做的是,一旦你发现两个连续的字符相同,你应该跳过即将出现的相同角色。你需要一个内循环。可能是do-while

您应该将for循环修改为:

for(int i = 0; i < input.length() - 1; i++)
{
    if(array[i] == array[i+1])
    {
        System.out.println(i);
        do {
            i++;
        } while (i < input.length() - 1 && array[i] == array[i + 1]);
    }
}

此外,ArrayList没有length属性。您应该使用size()方法来获得最大尺寸。


顺便说一句,这也可以使用正则表达式来完成。好吧,你可能还没有被教过这个,但这只是另一种可能的方式:

Pattern pattern = Pattern.compile("0{2,}|1{2,}");
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(matcher.start());
}

答案 2 :(得分:0)

那里有两个问题:

首先,当postfix ++在生效前返回值时,您将array [i]与其自身进行比较。

另外,你每个循环都做两个加1,所以只有奇数。

答案 3 :(得分:-1)

试试这个: -

Scanner keyboard = new Scanner(System.in);
    ArrayList runs = new ArrayList();


    System.out.println("Enter non empty string of 1s and 0s");
    String input = keyboard.nextLine();
    char[] array = input.toCharArray();

    for(int i = 0; i < input.length()-1; i++)
    {
        if(array[i] == array[i+1])
        {
            runs.add(i);
        }

    }
    for(int i = 0; i<= array.length; i++)
    {
        System.out.println(runs);
    }