在两个奇数之间插入破折号

时间:2015-05-16 01:22:03

标签: java

人。在我的计划中,我收集用户输入的String类型的数字,并将dashes放在two odd numbers之间。例如:

Input = 99946    Output = 9-9-946
Input = 56730    Output = 567-30 

但是在我的代码中,例如,如果我写9933444,那么我得到的输出是:9-9-9-3-3-3-344444。它正确地用短划线分隔奇数,但添加额外的数字。可能导致这个错误的原因是什么?

import java.util.Arrays;
import java.util.Scanner;

public class DashInsert {

    public static void main(String[] args)
    {
        Scanner kbd = new Scanner(System.in);
        System.out.println("Enter the numbers: ");
        String myString = kbd.nextLine();
        char[] numbers = myString.toCharArray();
        String result = "";

        for(int i = 1; i < numbers.length; i++)
        {
            int value1 = Character.getNumericValue(numbers[i]);
            int value2 = Character.getNumericValue(numbers[i-1]);


            if(value1 % 2 != 0 && value2 % 2 != 0)
            {
                result += numbers[i-1] + "-" + numbers[i] + "-";
            }
            else 
                result += numbers[i-1] + "" + numbers[i];
        }
        System.out.println(result);

    }

}

4 个答案:

答案 0 :(得分:2)

有一个简单的单行解决方案:

str = str.replaceAll("(?<=[13579])(?=[13579])", "-");

这可以通过在奇数之间匹配并用短划线替换(零宽度)匹配来实现。正则表达式背后是一个展望未来。

可以通过捕获奇数位并使用后向引用将它们放回来而不用环顾四周来完成:

str = str.replaceAll("([13579])([13579])", "$1-$2");

两种解决方案都能达到相同的效果。

答案 1 :(得分:1)

代码可以简化一点(以及解决“双字符”错误):

String str = "9933444";
char[] numbers = str.toCharArray();
String result = "";

for(int i = 1; i < numbers.length; i++)
{
    int value1 = Character.getNumericValue(numbers[i-1]);
    int value2 = Character.getNumericValue(numbers[i]);
    result += value1;
    if(value1 % 2 != 0 && value2 % 2 != 0) {
        result += "-";
    }
}
result += numbers[numbers.length - 1];
System.out.println(result);

<强>输出

9-9-3-3444

“双字符”错误的原因是每个循环都会打印位置i-1i上的项目。这意味着i将在下一个循环中再次打印(它将变为i-1)。

如果您使用的是Java 8 - 您可以使用Stream做一些看起来更像您最初尝试的事情:

public static void main(String[] args){
    String str = "9933444";
    List<String> lst = Arrays.asList(str.split(""));
    String res = lst.stream().reduce((a,b) -> {
        if (isOdd(a) && isOdd(b)) {
            return a + "-" + b;
        }
        else {
            return a + b;
        }
    }).get();
    System.out.println(res);
}

// grep the last digit from the string and check if it's odd/even
public static boolean isOdd(String x) {
    if (x.length() > 1) {
        if (x.substring(x.length()-1).equals("-")) {
            x = x.substring(x.length()-3, x.length()-2);
        }
        else {
            x = x.substring(x.length() - 1);
        }
    }
    return Integer.parseInt(x) % 2 == 1;
}

<强>输出

9-9-3-3444

答案 2 :(得分:0)

该错误是由于即使您一次循环一个数字列表,也会在每次循环迭代时写出两个数字。从逻辑上讲,这种设计总会产生重复的数字。

将循环更改为两次迭代,或者在每次循环迭代中打印一个数字。

答案 3 :(得分:0)

不要在两个奇数之间用“ - ”连接起来,在评估期间,只需在每次迭代中检查的数字之后加上“ - ”。

public static void main(String[] args) throws Exception {
    Scanner kbd = new Scanner(System.in);
    System.out.println("Enter the numbers: ");
    String myString = kbd.nextLine();
    char[] numbers = myString.toCharArray();

    String result = "";
    for(int i = 0; i < numbers.length; i++) {
        int value1 = Character.getNumericValue(numbers[i]);
        int value2 = i + 1 < numbers.length 
                ? Character.getNumericValue(numbers[i + 1]) 
                : 0;

        if(value1 % 2 != 0 && value2 % 2 != 0) {
            result += numbers[i] + "-";
        } else {
            result += numbers[i];
        }
    }
    System.out.println(result);
}

结果:

  

输入:99946输出:9-9-946

     

输入:56730输出:567-30

     

输入:9933444输出:9-9-3-3444