2015-05-16 4 views
1

люди. В моей программе я беру пользовательский ввод чисел типа 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); 

    } 

} 
+1

Время использовать отладчик, не так ли? –

+3

Это не отладка кода. Я понимаю, что это какое-то учебное упражнение. Если это так, то одна из вещей, которую вы должны изучать, - это отладить собственный код. Есть множество ресурсов, которые помогут вам начать работу; например http://www.vogella.com/tutorials/EclipseDebugging/article.html. Но самый важный ресурс - между ушами. Попытайтесь сделать это сами. –

ответ

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); 

OUTPUT

9-9-3-3444 

Причиной «двойной char "заключается в том, что каждый цикл печатает оба элемента на местах i-1 и i. что означает, что 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; 
} 

OUTPUT

9-9-3-3444 
0

Ошибка связана с тем, что, хотя вы зацикливаете свой список чисел по одному, вы выписываете два числа с каждой петлей итерация. Логично, что этот проект всегда будет давать повторяющиеся числа.

Либо измените свой цикл на итерацию по двум, либо напечатайте одно число в каждой итерации цикла.

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

2

Существует тривиальное однолинейное решение:

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

Это работает путем сопоставления между нечетных чисел и заменами (нулевой шириной) совпадает с тиром. Регулярное выражение выглядит и смотрит вперед.

Это может быть сделано без просмотровых обходные, захватив нечетные цифры и положить их обратно с помощью обратной ссылки:

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

Оба решения достичь того же результата.

Смежные вопросы