2017-02-01 1 views
0

У меня есть проект на Java, который я пытаюсь сделать (для удовольствия), но я боюсь этого шага. У меня есть города, которые я пытаюсь читать из двух стран, из Соединенных Штатов и Китая, и у меня возникают проблемы с чтением файла. Я пытаюсь использовать разделитель для разделения городов в Китае и Соединенных Штатах.Чтение файла и его хранение в 2D-массив объектов в Java?

Вот мой текстовый файл "Cities.txt"

San Francisco 9874343 543443 193838

Лос-Анджелес 3900000 52000 22000

Балтимор 622104 34423 1234

Хьюстон 2196000 45444 29393

Нью-Йорк 8500000 54000 27000

Филадельфия 1510000 654334 21343

Boston 6423344 345334 13443

Чикаго 2719000 39000 19282

San Diego 1323343 432343 18374

Даллас 1258000 423343 17363 |

Пекин 21500000 32454 23454

Hangzhouu 9018000 32343 192828

Shanghia 24500000 432345 23444

GuangZhou 20800654 323455 298383

Ухань 10670000 54344 302344

Шаньтоу 5391028 43345 23235

Hong Kong 7234800 39039 278383

Макао 650900 34543 17364

Шэньчжэнь 10630000 44343 19883

ZIBO 2980000 49383 20009

Вот мой основной класс Java. У меня также есть класс Cities с конструктором, getters/seters и toString();

static Cities[][] multi = new Cities[2][10]; 



public static void main(String[] args) throws FileNotFoundException { 
    System.out.println("The point of this program is to compare different cities in the two major superpower countries, \n The United States and China."); 
System.out.println("The information in the cities in stored in a 2D array of Objects and is pre-created in a text files. \n Please pick an option to manipulate the information in the array."); 
Scanner in = new Scanner(System.in); 
String name = " "; 
int population = 0; 
double wage = 0.0; 
int density = 0; 
Cities cities = new Cities(name,population,wage,density); 

boolean exit = false; 
readcity(name); 
String options = "1). Print all the cities. \n 2). Print just the united states cities. \n 3). Print just the China Cities \n 90). Exit program"; 
System.out.println(options); 
int decide = in.nextInt(); 
while (!exit) 
{ 
    switch (decide) { 
     case 1: 
     { 
      printarray(name,population,wage,density); 
     } 
     case 2: { 

     } 
     case 3: { 

     } 

     case 90: { 
      exit = true; 

     } 
} 

} 
} 


public static Cities readcity(String fline) 
{ 
try { 
    String name; int population; double wage; int density;   
    int countries = 2; int city = 10; 
    Scanner fileScan = new Scanner(new File("/src/Cities.txt")); 
    fileScan.useDelimiter("|"); 
    while (fileScan.hasNext()) { 
     name = fileScan.next(); 
     population = fileScan.nextInt(); 
     wage = fileScan.nextDouble(); 
     density = fileScan.nextInt(); 
    Cities City = new Cities(name, population, wage, density); 
    return new Cities(name,population,wage,density); 

    } 




fileScan.nextLine(); 
Cities City = readcity(fline); 
multi[countries][city] = City; 
return City; 
    } 
    catch(Exception e) { 
    System.out.println("Looks like there was an error."); 
    } 
    Cities City = readcity(fline); 
    return City; 
    } 
public static void printarray(String name, int population, double wage, int density) throws FileNotFoundException{ 


Cities cities = new Cities(name,population,wage,density); 

        for (int row =0; row < multi.length; row++){ 
         for (int column = 0; column < multi[row].length; column++){ 
          System.out.println(multi[row][column]); 
         } 
         System.out.println(); 
        } 
        cities.toString(); 
    } 
    } 

Метод, кажется, делает бесконечный рекурсивный вызов, но мне интересно, как я это исправить. Могу ли я сделать тот же подход для двух файлов и реализовать этот путь? Или я бы вытащил их метод для чтения в городах и внедрить их с помощью разного подхода? Я слабый с обработкой файлов, и использование 2d-массива - даже более высокий уровень поверх этого. Попытка исправить мои недостатки, чтобы любая помощь, которую вы могли мне дать, была бы полезна.

ответ

0

Ну, с чего начать ...

  1. Метод readcity() вызывает себя рекурсивно. Я не думаю, что это была идея. Попробуйте удалить эти вызовы.
  2. Вы начальный вызов readcity() с аргументом "". Не знаю, в чем дело.
  3. Открывающая скобка "{" after "while (fileScan.hasNext()), по-видимому, потеряна в коде выше.
  4. В общем, попробуйте назвать ваши классы и переменные в соответствии с их множеством. Если объект должен содержать один город, его класс должен называться «Город». Если объект должен содержать коллекцию городов, вы можете вызвать класс «Города».
0

В этой ситуации нет необходимости в рекурсии для чтения из файла. Я определенно рекомендую писать комментарии, чтобы внешний пользователь знал, что все делает в основном. Um. Я также хотел бы облегчить получение данных из файла, так как у вас нет большого опыта работы с файловой обработкой, которую я предполагаю ?.

Я переформатировал файл, чтобы сделать вещи в некотором смысле. Таким образом, вы можете получить каждую информацию между «,», используя split.

US: 
San Francisco, 9874343, 543443, 193838 
Los Angeles, 3900000, 52000, 22000 
Baltimore, 622104, 34423, 1234 
Houston, 2196000, 45444, 29393 
New York City, 8500000, 54000, 27000 
Philadelphia, 1510000, 654334, 21343 
Boston, 6423344, 345334, 13443 
Chicago, 2719000, 39000, 19282 
San Diego, 1323343, 432343, 18374 
Dallas, 1258000, 423343, 17363 
China: 
Beijing, 21500000, 32454, 23454 
Hangzhouu, 9018000, 32343, 192828 
Shanghia, 24500000, 432345, 23444 
GuangZhou, 20800654, 323455, 298383 
Wuhan, 10670000, 54344, 302344 
Swatow, 5391028, 43345, 23235 
Hong Kong, 7234800, 39039, 278383 
Macau, 650900, 34543, 17364 
Shenzhen, 10630000, 44343, 19883 
Zibo, 2980000, 49383, 20009 

и это класс, который я сделал для чтения данных и хранения в 2-х массивах городов.

public class CityReader { 


    public static void main(String[] args) 
    { 

     City[][] cities = new City[2][10]; 
     readFileInto2D("src/Cities.txt",cities); 
     //User prompt on what they want to here?  
     print2DArray(cities); 
    } 

    public static void readFileInto2D(String filename,City[][] cities) 
    { 
     City city; 
     String name = ""; 
     int population = 0; 
     int wage = 0; 
     int density = 0; 

     try { 

      Scanner scan = new Scanner(new File(filename)); 

      String line; 
      String[] parsed; 

      //Read US: 
      if(scan.hasNext()) 
       line = scan.nextLine(); 

      //Keep track of rows 
      int indexer = 0; 
      //Keep track of columns 
      int indexer2 = 0; 

      while(scan.hasNext()) 
      { 
       line = scan.nextLine(); 

       if(line.contains("China")) 
       { 
        indexer += 1;//Go to next row 
        indexer2 = 0;//Start index at beginning of column. 
        line = scan.nextLine();//Read next line, ignore line with China. 
       } 
       parsed = line.split(", "); //This splits each line 
              //into an array of name,pop,wage,and density 
       name = parsed[0]; 
       population = Integer.parseInt(parsed[1]); 
       wage = Integer.parseInt(parsed[2]); 
       density = Integer.parseInt(parsed[3]);    
       city = new City(name,population,wage,density);    
       cities[indexer][indexer2] = city;//Add to 2D Array.    
       indexer2++;        
      } 


     } catch (IOException ioe) { 
      // TODO Auto-generated catch block 
      ioe.printStackTrace(); 
     } 



    } 

    public static void print2DArray(City[][] cities) 
    { 
     //row 
     for(int i = 0; i < cities.length; i++) 
     { 
      //column 
      for(int j = 0; j < cities[i].length;j++) 
      { 
       City city = cities[i][j]; 
       //used getters to print information. 
       System.out.printf("%s %d %d %d\n",city.getName(), 
         city.getPopulation(),city.getWage(), 
         city.getDensity()); 
      } 
      System.out.println(); 
     } 
    } 
} 

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

+0

Вы - спасатель жизни, спасибо вам! И да, вы правы, я не испытываю проблем с файлами и многомерными массивами, и я пытаюсь поправиться. –

+0

Практикующие отлично! и приветствую вас. Попытайтесь больше узнать о рекурсии и о том, как ее использовать и как ее использовать. – CabDude