Первая позиция моего массива не изменяется - PullRequest
0 голосов
/ 14 ноября 2018

Я создаю приложение, которое преобразует 5-значный почтовый индекс в рамки. Как ни странно, первая введенная цифра не проходит корректно преобразование. Вот код:

import java.util.*;
import java.lang.*;
import java.io.*;
class Zip{

    public static String checkDigit(String bar)
    {
        Scanner s = new Scanner(System.in);
        int [] input;
        input = new int [4];
        for(int p = 0; p < 4; p++)
        {
            input[p] = s.nextInt();
            if (input[p] == 0)
            {
                bar = bar + "||:::";
            }
            if (input[p] == 1)
            {
                bar = bar + ":::||";
            }
        }
        System.out.println();
        return bar;
    }

    public static void main (String[] args) {   
        Scanner s = new Scanner(System.in);
        System.out.println(checkDigit(s.nextLine())); 
    }
}

Например, при вводе 1, 0, 0, 0, 0 в массив, вывод будет

"1 || ::: || ::: || ::: || :::"

При вводе 0, 1, 1, 1, 1 в массив выводится

"0 ::: || ::: || ::: || ::: ||"

Вместо преобразования первой цифры в pos [0], она просто печатает число напрямую. Почему это?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Это из-за s.nextLine() он будет читать первый введенный в консоли int и сохранять его в String bar, передавая в checkDigit()

Scanner s = new Scanner(System.in);
    System.out.println(checkDigit(s.nextLine())); 

Передать пустую строку

Scanner s = new Scanner(System.in);
    System.out.println(checkDigit("")); 

Ввод: 0 1 1 1

Вывод: || :::::: || ::: || ::: ||

0 голосов
/ 15 ноября 2018

Здесь на самом деле не так много проблем @ddalcanto.С вашей логикой все в порядке .. Всего лишь несколько мелких ошибок, которые вызывают аномалии в выводе.

  1. 1-й ввод отображается как есть, потому что вы добавляете обновленные значения в строку bar, которая является ничем иным, как первым принятым символом из-за s.nextLine() в функции main(),Следовательно, см. Пункт номер 2.
  2. Нет необходимости отправлять s.nextLine() в качестве аргумента для вызова функции checkDigit().Также удалите string bar как параметр из определения функции тоже.Это то, что заставляет вас дать дополнительный вклад.Например, 5 входов для предполагаемых 4 входов и т. Д.
  3. Ваш массив input[] имеет размер 4, но вы выполняете цикл с 0 to 4, что означает 5 раз, чтобы получить 5 входов, но массив можетдержать только 4 elemnts.Просто измените размер массива на 5. => input = new int[5];

Вот обновленный рабочий код вместе с соответствующим выводом.

CODE:

import java.util.*;
import java.lang.*;
import java.io.*;
class Zip{

    public static String checkDigit()
    {
        Scanner s = new Scanner(System.in);
        String bar  = "";
        int [] input;
        input = new int [5];
        for(int p = 0; p < 5; p++)
        {
            input[p] = s.nextInt();
            if (input[p] == 0)
            {
                bar = bar + "||:::";
            }
            if (input[p] == 1)
            {
                bar = bar + ":::||";
            }
        }
        System.out.println();
        return bar;
    }

    public static void main (String[] args) {   
        Scanner s = new Scanner(System.in);
        System.out.println(checkDigit()); 
    }
}

ВЫХОД:

 1
 1
 1
 1
 1

:::||:::||:::||:::||:::||

Другая пара вход-выход:

 0
 1
 1
 0
 1

||::::::||:::||||::::::||
0 голосов
/ 15 ноября 2018

Вы создаете и считываете из объекта Scanner в main (), поэтому первая цифра входит в параметр bar, отправляемый методу checkDigit.

Я бы вообще удалил параметр bar, а также сделал некоторые другие изменения.

public static String checkDigit() {
    StringBuilder bar = new StringBuilder();
    Scanner s = new Scanner(System.in);
    int input = 0;
    for(int p = 0; p < 5; p++) {
        input = s.nextInt();
        if (input == 0) {
            bar.append("||:::");
        }
        if (input == 1) {
            bar.append(":::||");
        }
    }
    return bar.toString();
}
...