2017-02-01 4 views
0

私はJavaでプロジェクトをしています。(楽しく)しようとしていますが、このステップでは苦労しています。私はアメリカと中国の2カ国からの読書を試みている都市があり、ファイルの読み込みに問題があります。私は区切り文字を使って中国と米国の都市を分けようとしています。ここでファイルを読み込んでJavaのオブジェクトの2D配列に格納しますか?

は私のテキストファイル "Cities.txt"

サンフランシスコ9874343 543443 193838

ロサンゼルス390万52000 22000

ボルチモア622104 34423 1234

ヒューストン2196000 45444 29393です

ニューヨーク市8500000 54000 27000

フィラデルフィア151万654334 21343

ボストン6423344 345334 13443

シカゴ2719000 39000 19282

サンディエゴ1323343 432343 18374

ダラス1258000 423343 17363 |

北京2150万32454 23454

Hangzhouu 9018000 32343 192828

Shanghia2450万432345 23444

広州20800654 323455 298383

武漢1067万54344 302344

Swatow 5391028 43345 23235

香港7234800 39039 278383

マカオ650900 34543 17364

深セン1063万44343 19883

淄博298万49383 20009

ここに私のメインのJavaクラスです。私はまた、コンストラクタ、getters/settersとtoString()を持つCitiesクラスを持っています。

このメソッドは無限の再帰呼び出しを行っているようですが、これをどのように修正するのかと思います。私は2つのファイルに対して同じアプローチを行い、その方法を実装しますか?あるいは、私は都市を読み込み、異なるアプローチでそれらを実装する方法から取り除きますか?私はファイルの取り扱いに弱く、2D配列を使用することはその上に重い層ですらあります。私の弱点を修正しようとすると、あなたが私に与えるどんな助けでも有益になります。

答えて

0

どこから始めるのですか?

  1. あなたのreadcity()メソッドは、それ自身を再帰的に呼び出しています。私はこれがアイデアだとは思わない。これらの呼び出しを削除してみてください。
  2. readcity()への最初の呼び出しは、引数 ""を使用しています。意図は何だったのか分かりません。
  3. 上記のコードで明らかに "while(fileScan.hasNext())"が消失した後の "{"
  4. 一般的には、クラスと変数の名前に複数の名前を付けてください。オブジェクトがある都市を保持することになっている場合、そのクラスは "City"と呼ばれるべきです。オブジェクトが都市のコレクションを保持することになっている場合は、クラス「都市」を呼び出すことができます。
0

この状況でファイルを読み込む必要はありません。私は間違いなく外部のユーザーが基本的に何をしているのかを知るようにコメントを書くことをお勧めします。 Um。私はあなたが仮定しているファイル処理に関する多くの経験を持っていないので、ファイルからデータを取得することも容易になります。

ファイルを再フォーマットして、意味を簡単にしました。そうすれば、スプリットを使って '、'の間で各情報を得ることができます。

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(); 
     } 
    } 
} 

これは完全ではないため、エラーチェックが行われないため、ユーザーは簡単にエラーを実装できます。これはそれを行うための一つの方法を示しています。使用される都市クラスは、コンストラクタとgetterとsetterだけで基本的です。

+0

あなたは命の恩人ですよ、ありがとう!そして、はい、私はファイルと多次元配列については経験がありませんし、私はそれをより良くしようとしています。 –

+0

練習メーカーが完璧!あなたは大歓迎です。再帰と、それがどのように使用され、どのように使用されるのかを詳しく調べてみてください。 – CabDude

関連する問題