2015-07-18 3 views
1
public class PairsWithSumK 
{ 
    public static void main(String[] args) { 
     // Write your code here 
     Scanner sc= new Scanner(System.in); 
     int test= sc.nextInt(); 
     for(int i=0;i<test;i++) 
     { 
      int num= sc.nextInt(); 
      int sum= sc.nextInt(); 
      String a; 
      a = sc.next(); 
      String [] array= a.split(" "); 
      int count=0; 
      for(int j=0;j<num;j++) 
      { 
       int x=0; 
       x=sum-Integer.parseInt(array[j]); 
       String xs =String.valueOf(x); 
       if(Arrays.asList(array).contains(xs)) 
       { 
        int index=Arrays.asList(array).indexOf(xs); 
        array[index]=array[j]="-1"; 
        count++; 

       } 
      } 
      System.out.println(count); 
     } 
    } 
} 

Я пытаюсь взять консольный ввод в java, но вместо того, чтобы взять всю строку и затем преобразовать ее в строковый массив, код принимает только 1-й символ. Например, для ввода «1 2 3 4 5 6» строка «a» будет принимать только 1. Являясь новым для кодирования, я застрял в этом.Невозможно взять полный ввод строки с консоли

ответ

0

Следующий() метод сканера принимает строку только для следующего разделителя (по умолчанию используется пробел). Поэтому в вашем случае каждый вызов auf sc.next() будет читать в одном из ваших номеров (первый 1, затем 2 и т. Д.).

Итак, в вашем коде вы не читали бы их в виде строки и не разбивали бы, а просто заполняли каждый индекс массива seperatly с помощью sc.next().

(вы можете использовать sc.hasNext(), чтобы увидеть, добавили ли вы весь ввод).

0

По умолчанию Scanner с нами, используя в качестве разделителя один или несколько белых пространств и next() будет пытаться читать и вернуть маркер до следующего разделителя. Так, например, если ваш вклад будет

1 2 foo bar 

тогда код, такой как это будет возвращать

nextInt(); // 1 
nextInt(); // 2 
next(); // foo 
next(); // bar 

Обратите внимание, что первый next() не вернулся foo bar но только foo, потому что был разделителем после него, так что нет места для разделения. Если вы хотите прочитать остальные строки вам нужно будет использовать nextLine()

Но будьте осторожны с этим методом, так как если ваш вклад будет 1\nfoo и вы будете называть nextInt и nextLine вы получите 1 и "" (пустая строка), как результат, потому что следующая строка пытается прочитать содержимое до следующего разделителя строк или до конца данных. Поэтому в случае 1\nfoo после nextInt() курсор будет установлен после 1, например 1|\nfoo, поэтому между его текущей позицией и разделителем следующей строки (\n) будет только пустая строка.