Как получить пользовательский ввод в двух отдельных массивах?

1

Привет, У меня возникли проблемы со Сканером, чтобы получить пользовательский ввод двух отдельных ArrayList. Когда я запускаю этот код, я получаю исключение IndexOutOfBounds после ввода двух массивов. Код добавляет два двоичных числа вместе, используя логику рябь. Примером ввода пользовательского ввода будет

Введите массив: 1 0 1 0 Введите B Массив: 0 0 0 1 произ.: 1 0 1 1

Код работает, когда массивы жестко закодированы, как я могу заставить пользователя вводить массивы?

Код показан ниже

import java.util.*;

public class AdderApp {
    public static void main(String[] args) {

        Scanner inputA = new Scanner(System.in);
        ArrayList<Integer> aList = new ArrayList<Integer>();
        ArrayList<Integer> bList = new ArrayList<Integer>();
        int c = 0;

        System.out.println("Enter A array");
        aList.add(inputA.nextInt());

        Scanner inputB = new Scanner(System.in);
        System.out.println("Enter B array");
        bList.add(inputB.nextInt());

        Adder bit1 = new Adder(parseInput(aList.get(3)), parseInput(bList.get(3)), parseInput(c));
        Adder bit2 = new Adder(parseInput(aList.get(2)), parseInput(bList.get(2)), bit1.getCout());
        Adder bit3 = new Adder(parseInput(aList.get(1)), parseInput(bList.get(1)), bit2.getCout());
        Adder bit4 = new Adder(parseInput(aList.get(0)), parseInput(bList.get(0)), bit3.getCout());

        if (bit4.getCout() == false) {
            System.out.println(bit4.toString() + " " + bit3.toString() + " " + bit2.toString() + " " + bit1.toString());
        } else {
            System.out.println("overflow!");
        }

    }

    public static boolean parseInput(int i) {

        if (i == 1) {
            return true;
        } else {
            return false;
        }

    }
}

Код для класса Adder:

    public class Adder {

    private boolean a, b, cin, cout, s;

    /**
     * Full Adder contructor
     */

    public Adder(boolean a, boolean b, boolean cin) {

        this.a = a;
        this.b = b;
        this.cin = cin;

        s = nand(nand(a, b), cin); //sum bit
        cout = or(and(nand(a, b), cin), and(a, b)); // - carry bit

    }

    /** Half adder constructor */

    //    public Adder (bloolean a, boolean b) {
    //
    //      this.a = a;
    //      this.b = b;
    //
    //      s = 
    //}

    /**
     * NAND gate
     */
    public boolean nand(boolean a, boolean b) {

        return a ^ b;

    }

    /**
     * AND gate
     */
    public boolean and(boolean a, boolean b) {

        return a && b;

    }

    /**
     * OR gate
     */
    public boolean or(boolean a, boolean b) {

        return a || b;

    }

    public boolean getCout() {

        return cout;

    }

    public String toString() {

        if (s == true) {
            return "1";
        } else {
            return "0";
        }

    }

    public String toStringCout() {

        if (cout == true) {
            return "1";
        } else {
            return "0";
        }

    }
}
Теги:
arrays

4 ответа

1
Лучший ответ

Весь ваш класс AdderApp можно упростить и улучшить, чтобы принять любую длину бит, приняв ввод немного другим способом, а затем используя цикл for, чтобы добавить каждый бит. Функция parseInput может быть заменена простым логическим сравнением:

import java.util.*;

public class AdderApp {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.println("Enter A array");
        char[] aIn = input.nextLine().replace(" ", "").toCharArray();
        System.out.println("Enter B array");
        char[] bIn = input.nextLine().replace(" ", "").toCharArray();

        StringBuilder result = new StringBuilder();        
        Adder bit = new Adder(false, false, false);

        for (int i = aIn.length - 1; i >= 0; --i) {
            bit = new Adder((aIn[i] == '1'), (bIn[i] == '1'), bit.getCout());
            result.append(bit + " ");
        }
        System.out.println(bit.getCout() ? "overflow!" : result.reverse());
    }
}
  • 0
    Спасибо за это хорошо работает. Теперь он принимает ввод в виде байтового формата, т.е. 1010 0001, что идеально.
1

Scanner.nextInt получает следующее целое число во входе, а затем останавливается. Каждый из ваших списков содержит только 1 элемент.

Вместо этого используйте что-то в этом направлении:

String[] input = inputA.nextLine().split(" ");
for (String s : input)
{
    try { aList.add(Integer.parseInt(s)); }
    catch(NumberFormatException nfe) { /* handle exception as desired */ }
}

Кроме того, вы должны иметь возможность использовать что-то вроде:

while (inputA.hasNextInt())
{
    aList.add(inputA.nextInt());
}
0

Пользователь должен ввести 4 номера, ваш только позволяет пользователю ввести 1 номер:

int count = 0;
Scanner inputA = new Scanner(System.in);
System.out.println("Enter A array");
while(count < 4){
  count++;
  aList.add(inputA.nextInt());
}
count = 0;

Scanner inputB = new Scanner(System.in);
System.out.println("Enter B array");
while(count < 4){
  count++;
  bList.add(inputB.nextInt());
}

Если вы хотите использовать hasNextInt():

while(inputA.hasNextInt()){
  count ++;
  aList.add(inputA.nextInt());
  if(count == 4){
    count = 0;
    break;
  }
}
  • 0
    Да, это работает, спасибо - есть ли способ сделать это с hasNextLine ()?
  • 0
    Да, это будет та же логика, вы используете что-то вроде while (inputA.hasNextInt()) и когда вы будете считать до 4, вы while (inputA.hasNextInt()) цикл while.
Показать ещё 3 комментария
0

У вас должен быть цикл for для ввода в ваш ArrayList.

    System.out.println("Enter A array");
    for (int i = 0; i < 4; i++) {
        aList.add(inputA.nextInt());
    }


    Scanner inputB = new Scanner(System.in);

    System.out.println("Enter B array");           
    for (int i = 0; i < 4; i++) {
        bList.add(inputB.nextInt());
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню