2016-02-01 5 views
0

Я пытаюсь добавить только четные числа до ArrayList. По моему мнению, я работаю с файлом с помощью сканера. Путь к файлу должен быть написан на консоли. Также я использую 2 самых популярных способа определения четных чисел. Проблема - не только четные числа добавляют к моему ArrayList. Существует мой код:Четные и нечетные номера со сканером Java

BufferedReader bfReader = new BufferedReader(new InputStreamReader(System.in)); 
InputStream inputStream = null; 
List<Integer> myInts = new ArrayList<Integer>(); 

String filePath = null; 
try { 
    filePath = bfReader.readLine(); 
    inputStream = new FileInputStream(filePath); 
} catch (IOException e) { } 

Scanner scanner = new Scanner(inputStream); 
while (scanner.hasNext()) { 
    if ((scanner.nextInt() % 2) == 0 && scanner.nextInt() != 1) 
    myInts.add(scanner.nextInt()); 
    // if ((scanner.nextInt() & 1) == 0) 
    // myInts.add(scanner.nextInt()); 
} 

for (Integer x : myInts) { 
    System.out.println(x); 
} 

Я предполагаю, что я неправильно что-то о Scanner.
Был бы рад получить любые ответы!

ответ

2

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

Представьте, что ваш вход 4 3 1

Ваш код будет сделать это:

if ((scanner.nextInt() /* 4 */ % 2) == 0 && scanner.nextInt() /* 3 */ != 1) 
    myInts.add(scanner.nextInt() /* 1 */); 

И добавить 1 в свой список.

Вы должны изменить свой код на этот:

while (scanner.hasNext()) 
{ 
    int value = scanner.nextInt(); 
    if ((value % 2) == 0) 
     myInts.add(value); 
} 

Это будет читать только одно значение, и использовать его во всех сравнениях.

3

Причина в том, что каждый новый вызов nextInt() читает новое целое число от ввода.

Вот модифицированный фрагмент кода, который иллюстрирует то, что вы могли бы хотеть попробовать:

Scanner scanner = new Scanner(inputStream); 
int myInt; 

while (scanner.hasNext()) { 
    myInt = scanner.nextInt(); 

    if ((myInt % 2) == 0 && myInt != 1) 
    myInts.add(myInt); 
} 

Для получения дополнительной информации смотрите на docs.

0

Каждый раз, когда вы звоните scanner.nextInt(), вы получаете другой номер. Если вы хотите ссылаться на один и тот же номер несколько раз, назначьте переменную.

Кроме того, проверив, что число четное, вы не должны также проверить, что это не номер 1.

while (scanner.hasNext()) { 
    int n = scanner.nextInt(); 
    if (n%2 == 0) { 
     myInts.add(n); 
    } 
} 
1

Проблема здесь заключается в

if ((scanner.nextInt() % 2) == 0 && scanner.nextInt() != 1) 

Каждый раз, когда вы вызываете scanner.nextInt(), вы потребляете следующий вход. Из-за этого вы в конечном итоге отбрасываете большую часть ввода. Чтобы исправить это, вам нужно будет что-то вроде

while (scanner.hasNext()) 
    { 
     int i = scanner.nextInt; 
     if ((i % 2) == 0 && i != 1) 
      myInts.add(i); 
    } 

Это правильно потребляет вход и должно работать должным образом. документация Javadoc сканер, который содержит эту информацию, можно найти здесь: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

-1

В строке

if ((scanner.nextInt() % 2) == 0 && scanner.nextInt() != 1) 

Вы читаете два целых числа от входа, вместо проверки тот же, дважды:

int nextInt = scanner.nextInt(); 
if ((nextInt % 2) == 0 && nextInt != 1) 
1

Да, я думаю, вы поняли это неправильно. Всякий раз, когда вы используете метод nextInt() указателя класса сканера, файл сканирования переместится на nextInt(). Поэтому лучше сохранить эти целые значения во временной переменной. Ниже приведена модификация вашего кода,

BufferedReader bfReader = new BufferedReader(new InputStreamReader(System.in)); 
    InputStream inputStream = null; 
    List<Integer> myInts = new ArrayList<Integer>(); 

    String filePath = null; 
    try 
    { 
     filePath = bfReader.readLine(); 
     inputStream = new FileInputStream(filePath); 
    } 
    catch (IOException e) 
    { 
    } 

    Scanner scanner = new Scanner(inputStream); 
    while (scanner.hasNext()) 
    { 
     int firstNumber = scanner.nextInt(); 

     if ((firstNumber % 2) == 0 && firstNumber != 1) 
      myInts.add(firstNumber); 
     //if ((scanner.nextInt() & 1) == 0) 
     // myInts.add(scanner.nextInt()); 
    } 
    for (Integer x : myInts) 
    { 
     System.out.println(x); 
    } 
Смежные вопросы