Как преобразовать строку в int для произвольной длины массива при использовании строковых массивов и массивов символов - PullRequest
0 голосов
/ 09 мая 2018

Итак, я делаю простую программу, которая сначала сообщает пользователю, что пользователь сможет создать массив, в котором будут сохранены названия городов. Для этого мне понадобится строковый массив, чтобы вы знали, что я могу использовать слова для названий городов. После того, как пользователь сказал это, он спросил, сколько названий городов они хотели бы ввести. Вот где возникает основная проблема. Это создаст длину массива, но я не могу начать строковый массив с длиной int. Не удалось преобразовать строку [] в int []. В коде это происходит в строке 16. Моя вторая проблема в конце после того, как они вводят названия городов, которые он спрашивает "эти названия правильные?" и если они скажут нет, это вернет начало. Я попытался использовать оператор do здесь, но не смог, потому что он не позволит мне использовать массив позже после оператора do, так как он был создан в операторе do. Я понятия не имею, как это исправить / любой другой способ сделать это. Наконец, вот фактический код, чтобы вы могли увидеть, где проблемы:

import java.util.*;
public class MCassignment27
{
  public static void main(String[] args)
  {
    Scanner k = new Scanner(System.in);
    Random r = new Random();
    String again;
    do
    {
    System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
    System.out.println("\nYou will be able to create an array that saves the names of cities");
    System.out.println("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
    System.out.println("\nHow many cities would you like to enter?");
    int numcities = k.nextInt();
    String savedcities[] = new int[numcities];
    String cities = "";
    for (int i = 0;i < savedcities.length; i++)
    {
      System.out.println("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
      System.out.print("\nPlease enter the name of city #" + (i+1) + ":");
      cities += savedcities[i];
      savedcities[i] = k.nextLine();
    }
    System.out.println("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
    System.out.println("\nYour list of cities:");
    for (int j = 0;j < savedcities.length; j++)
    {
     System.out.println((j+1) + ". " + savedcities[j]); 
    }
    System.out.println("Are these all the cities you wanted to enter? y/n");
    again = k.nextLine();
    }
    while (again.equals("y") );
    System.out.println("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
    int rand = r.nextInt(savedcities.length);
    String word = savedcities[rand];
    char arr[] = word.toCharArray();
    for(int u=0; u<savedcities.length; u++)
    {
      System.out.println("Data at [" + u + "] = " + savedcities[u]);
    }
  }
}

Я хотел бы заранее поблагодарить вас, и я ценю ваше время, даже если вы не отвечаете, я ценю, что вы его прочитали. :) Хорошего дня!

1 Ответ

0 голосов
/ 09 мая 2018

первым делом String savedcities[] = new int[numcities];

можно изменить на String savedcities[] = new String[numcities];

При инициализации массивов в Java вы используете тот же тип после нового ключевого слова, что и массив, который вы хотите создать

например: Object[] myObjArray = new Object[size] или int[] myIntArray = new int[size]

Во-вторых, измените свой оператор while с while (again.equals("y") ); на while (again.equals("n") ); или while (!again.equals("n") );

оператор while продолжает цикл до тех пор, пока условие выполняется. В этом случае, если пользователь вводит y, цикл начинается снова. Однако, согласно тому, что вы сказали, цикл должен продолжаться только тогда, когда пользователь наберет n

В этом случае, для ясности, возможно, переименуйте again в done

Также разместите объявление вашего массива вне do while, чтобы его можно было использовать вне do while.

String[] savedcities;
do {
      .... your code...
      //when you initialize the array do it like the following
      savedCities = new String[numCities];
      for (int i = 0;i < savedcities.length; i++)
      {
         ...inside for loop....
      }
      ... rest of do while ....       
}

Теперь ваш последний выпуск с пропуском первой фазы выбора города немного сложен ... когда программа достигает этих строк:

System.out.println("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
System.out.print("\nPlease enter the name of city #" + (i+1) + ": ");
savedcities[i] = k.nextLine();

на первом проходе есть строка для чтения. (Вы можете определить это, напечатав результаты k.hasNext())

Это потому, что k.nextInt() читает целое число из консоли, но оставляет символ пробела позади. Этот символ пробела был напечатан на консоли, когда пользователь набирает номер, а затем нажимает клавишу ввода.

so k.nextLine() читает этот символ пробела и вводит в первую точку города. Вы можете проверить это, запустив и режим отладки.

Есть несколько способов решить эту проблему. Один хакерский способ, которым я воспользовался, это позвонить k.nextLine() после вызова k.nextInt()

Это эффективно вытянет символ пробела.

В качестве альтернативы вы можете попробовать прочитать всю строку, а затем проанализировать значение в целое число:

int numcities = Integer.parseInt(k.nextLine());

Последний раздел вашего кода перебирает сохраненные города:

for(int u=0; u<savedcities.length; u++)
{
    System.out.println("Data at [" + u + "] = " + savedcities[u]);
}

но у вас уже есть arr[], который содержит все символы случайного города, который вы выбрали. Вместо этого зацикливайтесь на этом.

...