2017-02-22 78 views
0

Я совершенно новый для java. Я пробовал некоторые вещи для проекта, но я не понимаю, почему это не работает. Цель состоит в том, чтобы позволить пользователям вводить числа, разделенные пробелами, и заканчивать буквой. Затем программе необходимо подсчитать четные и нечетные индексированные числа и выводить, какая сумма больше.Как вы рассчитываете количество чисел, когда ввод задается разделенным пробелами, заканчивающимся буквой?

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

По какой-то причине цикл while не заканчивается и продолжает работать. Как подсчитать количество введенных чисел?

EDIT

Я добавил in.next(); в первом цикле while, поэтому он не застревает в первом входном элементе. Это приводит меня к еще одной проблеме, однако, наличие двух циклов, которые пытаются пропустить один и тот же вход. Я попытался создать второй сканер и сбросить первый, но второй цикл не запускается в первом элементе. Предыдущие ответы показывают, что это невозможно, есть ли способ поставить это в один цикл while, все еще используя массивы для хранения значений?

P.S. Входные значения должны быть любыми положительными или отрицательными целыми числами.

Вот мой полный код:

import java.util.Scanner; 

public class LargerArraySum { 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    int length = 0; 
    System.out.println("Enter your numbers seperated by spaces, end with a letter"); 

    while(in.hasNextInt()) { 
     length++; 
     in.next(); 
    } 
    System.out.println(length); 

    int arra[] = new int[length]; 

    while(in.hasNextInt()) { 
     for(int i=0;i<length;i++) { 
      int x = in.nextInt(); 
      arra[i] = x; 
     } 
    } 
    int evenSum = EvenArraySum(arra); 
    int oddSum = OddArraySum(arra); 

    if(evenSum<oddSum) { 
     System.out.println("The sum of the odd indexed elements is bigger"); 
    } else if(oddSum<evenSum) { 
     System.out.println("The sum of the even indexed elements is bigger"); 
    } else { 
     System.out.println("The sum of the odd and even indexed elements is equal"); 
    } 

} 
public static int EvenArraySum(int[] a) { 
    int sum = 0; 
    for(int i=1;i<a.length;i+=2) { 
     sum += a[i]; 
    } 
    System.out.println("The sum of the even indexed elements is: " + sum); 
    return sum; 
} 
public static int OddArraySum(int[] a) { 
    int sum = 0; 
    for(int i=0;i<a.length;i+=2) { 
     sum += a[i]; 
    } 
    System.out.println("The sum of the odd indexed elements is: " + sum); 
    return sum; 
} 
} 
+0

Какой цикл 'while' продолжает работать? У вас есть 2. – Eabryt

+1

Ваш цикл while не заканчивается, потому что вы не потребляете следующий int, поэтому вы всегда проверяете тот же номер. Я предлагаю использовать ArrayList для вашего случая вместо массива с фиксированной длиной. – IQV

+0

Тот, в котором я делаю возведение длины – Fiosaurus

ответ

0

добавить in.next(); в петле. На самом деле вам не нужен массив. Вы можете суммировать четные и нечетные индексированные числа при чтении без их сохранения.

+0

Но он хочет сохранить числа, как и другие вычисления, - посмотрите на «EvenArraySum» и «OddArraySum». Поэтому 'in.next()' не решает его проблему. – IQV

+0

Он делает это, только проверяет индекс ввода в обоих методах и создает сумму нечетных и четных чисел. Он мог сделать это все вместе в первом цикле (без сохранения конкретных номеров ввода). – SWoeste

0

1) Ваш первый цикл while не работает, потому что итератор всегда проверяет дальнейшие номера из одной позиции.

Пример:

Position  0 1 2 3 4 5 
Value  1 3 5 7 9 0 

При запуске точки итераторов в положение 0. При вызове hasNextInt() он будет проверять, если позиция 1 доступна, в данном случае это будет правдой. В этот момент интратор все еще указывает на позицию 0. Таким образом, вы увеличиваете length и делаете то же самое снова, поэтому у вас есть бесконечный цикл.

Чтобы переместить итератор на следующую позицию, вам необходимо позвонить nextInt().

2) Вы не можете перебирать один и тот же Scanner со вторым while-loop таким образом. Если вы сначала исправите первый цикл, то итератор укажет на позицию 5 (она дойдет до конца сканера). Таким образом, проверка на hasNextInt() будет ложной, а второй цикл while не будет введен.

3) Комментарии уже упоминалось, вы могли бы использовать ArrayList для этого случая использования как так:

final ArrayList<Integer> input = new ArrayList<>(); 
    while (in.hasNextInt()) { 
     input.add(in.nextInt()); 
    } 
    System.out.println(input.size()); 

(или как kitxuli упомянутых в своем ответе, даже не сохранять значения, просто сосчитать их в первая петля while)

+0

Спасибо за ваш ответ, nextInt сделал работу, но это привело меня ко второму пункту. Есть ли способ заставить сканер начать работу в первом месте? Я попытался сбросить его или создать новый сканер, но это, похоже, не сработало. Я еще не работал с ArrayLists, и сначала хочу узнать, разрешимо ли это, используя массивы для его хранения, но ArrayLists кажутся логичным следующим шагом для меня. – Fiosaurus

+0

В то время, когда я писал свой ответ, я не был уверен, можно ли сбросить сканер, чтобы начать с позиции 0 или нет. Теперь я могу сказать вам, это невозможно. Если вы создаете новый сканер, пользователь должен снова ввести значения, что не похоже на решение для меня;) – SWoeste

+0

Так что, используя два цикла while за ту же дату, не работает период? Я попытался использовать решение Омара с использованием пустой строки, но это полезно только при использовании однозначных положительных чисел. Нет ли способа поставить это в один цикл while, все еще используя массивы для хранения чисел? – Fiosaurus

0

У вашего кода 2 основных проблемы. Первая и вторая петли позволяют взглянуть на ваш первый цикл.

while(in.hasNextInt()) { 
    length++; 
} 

ваше состояние in.hasNextInt() сделал вставить вход, потому что никакая переменная не была инициализирована с in.nextInt, но и возвращает либо [верно] или [ложь] так долго, как это правда, что добавит к переменной длины без запроса вставить [новый ввод]. Код должен выглядеть так.

Int length = 0; 
int k ; 
    while(in.hasNextInt()) { 
     length++ ; 
     k = in.nextInt(); 
    } 

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

Давайте посмотрим на ваш второй цикл.

while(in.hasNextInt()) { 
    for(int i=0;i<length;i++) { 
     int x = in.nextInt(); 
     arra[i] = x; 
    } 
} 

В in.NextInt() вы побуждая пользователя ввести новый вход еще раз, так что вам не нужно Int x.Not даже петлю в то время как .Однако вы должны объявить новый сканер в этом экс: Я называю это Ĉ Код должен выглядеть следующим образом.

int [] a = new int [length]; 
Scanner c = new Scanner (System.in); 
for(int i=0;i<length;i++) { 
if (c.hasNextInt()){ 
a[i] = c.nextInt();   
} else 
break; 
    } 

Вы должны добавить, если заявление, потому что если вы получаете алфавит в целочисленном массиве, вы получите ошибку исключения .The массив а [я] не будет запрашивать у пользователя.

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

НОВЫЙ КОД: -

String g = ""; 
String j =""; 
int y ; 
int q=0; 
int w = 0; 
while (in.hasNextInt()) 
    { 
    y = in.nextInt(); 
    g =g+y+","; 
    q++; 

} 
int arra [] = new int [q]; 

    for(int r =0;r<g.length();r++) { 

     if(g.charAt(r)==(',')){ 
      arra[w]=Integer.parseInt(j); 
      System.out.println(arra[w]); 
      w++; 
      j=""; 
     }else{ 
    j=j+g.charAt(r); 
     } 

} 

Другой еще лучше код: -Вы просто вставить ваши номера, разделенных пробелами без буквы, нажмите клавишу ВВОД и массив заполняется.

Scanner in = new Scanner (System.in); 
String g = ""; 
String j =""; 
int y ; 
int q=0; 
int i=0; 
int w = 0; 

System.out.println("inset your input separated by spaces"); 
    g = in.nextLine(); 

while(i<g.length()){ 
    if((g.charAt(i))==(' ')){ 
    q++; 
} 
i++; 
} 
int a [] = new int [q+1]; 

    for(int r =0;r<g.length();r++) { 

     if(g.charAt(r)==(' ')){ 
      a[w]=Integer.parseInt(j); 
      System.out.println(a[w]); 
     w++; 
      j=""; 
     }else{ 
    j=j+g.charAt(r); 
     } 


    } 
    a[w]=Integer.parseInt(j); 
System.out.println(a[w]); 
+0

Спасибо за ваш ответ Омар. Вы правы в том, что не хотите, чтобы пользователь вводил цифры дважды, поэтому меня больше всего интересует ваша последняя часть кода. Это работает только, если я ввожу только цифры с цифрами, как только я введу число, равное 21 или -4, преобразование из строки в массив не даст того, что я хочу. – Fiosaurus

+0

Вы правы, мой код даже не был реалистичным. Вместо этого я сделал для вас лучший вариант. после того, как вы вставляете значения, вставляйте любую букву, тогда она будет печатать массив. запятая [','] добавляется к вашему входу в строке [g]. Длина массива равна количеству экземпляров, в которые вы вставили числа. Затем, в цикле for, он останавливается в запятой и заполняет первую ячейку ваш массив через другую пустую строку j и т. д. –