2012-04-13 5 views
0

私は州をソートしていますが、メインクラスをそのまま残しておき、Mungeというプライベートクラスを作る必要があります。時間、この時になって、時代の私のコードの数百人を変更し、基本的にはこの問題ファイルから読み込み、2D配列を使用してデータを並べ替える

のように見えるテキストファイルハミルトン、オンタリオ州
トロント、オンタリオ州
エドモントン、アルバータ州
レッドディア、アルバータ州からの読み込み
セントジョンズ、ニューファンドランド

この

アルバータ等出力する必要があります。エドモントン、レッドディア
オンタリオ;ハミルトン、トロント
ニューファンドランド;セントジョンズ

私のメインクラスは不変であり、この

public class Lab5 { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    if(args.length < 2) { 
     System.err.println("Usage: java -jar lab5.jar infile outfile"); 
     System.exit(99); 
    } 

    Munge dataSorter = new Munge(args[0], args[1]); 

    dataSorter.openFiles(); 
    dataSorter.readRecords(); 
    dataSorter.writeRecords(); 
    dataSorter.closeFiles(); 
    } 
} 

と私が作ったのmungeクラスを使用すると、言い訳する必要があります。この

package lab5; 

import java.io.File; 
import java.util.Scanner; 
import java.util.Formatter; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.SortedMap; 
import java.util.TreeMap; 

public class Munge 
{ 

private String inFileName, outFileName; 
private Scanner inFile; 
private Formatter outFile; 
private int line = 0; 

private String[] data; 

public Munge(String inFileName, String outFileName) 
{ 
    this.inFileName = inFileName; 
    this.outFileName = outFileName; 

    data = new String[100]; 
} 

public void openFiles() 
{ 
    try 
    { 
     inFile = new Scanner(new File(inFileName)); 
      File file = new File("input.txt"); 
      SortedMap<String, List<String>> map = new TreeMap<String, List<String>>(); 
      Scanner scanner = new Scanner(file).useDelimiter("\\n"); 
     while (scanner.hasNext()) { 
      String newline = scanner.next(); 
      if (newline.contains(",")) { 
      String[] parts = newline.split(","); 
      String city = parts[0].trim(); 
      String province = parts[1].trim(); 
      List<String> cities = map.get(province); 
      if (cities == null) { 
       cities = new ArrayList<String>(); 
       map.put(province, cities); 
      } 
      if (!cities.contains(city)) { 
       cities.add(city); 
      } 
      } 
     } 
      for (String province : map.keySet()) { 
       StringBuilder sb = new StringBuilder(); 
       sb.append(province).append(": "); 
       List<String> cities = map.get(province); 
       for (String city : cities) { 
        sb.append(city).append(", "); 
       } 
       sb.delete(sb.length() - 2, sb.length()); 
       String output = sb.toString(); 
       System.out.println(output); 
      } 
    } 
    catch(FileNotFoundException exception) 
    { 
     System.err.println("File not found."); 
     System.exit(1); 
    } 
    catch(SecurityException exception) 
    { 
     System.err.println("You do not have access to this file."); 
     System.exit(1); 
    } 

    try 
    { 
     outFile = new Formatter(outFileName); 
    } 
    catch(FileNotFoundException exception) 
    { 
     System.err.println("File not found."); 
     System.exit(1); 
    } 
    catch(SecurityException exception) 
    { 
     System.err.println("You do not have access to this file."); 
     System.exit(1); 
    } 
} 

public void readRecords() 
{ 
    while(inFile.hasNext()) 
    { 
     data[line] = inFile.nextLine(); 
     System.out.println(data[line]); 
     line++; 
    } 
} 

public void writeRecords() 
{ 
    for(int i = 0; i < line; i++) 
    { 
     String tokens[] = data[i].split(", "); 
     Arrays.sort(tokens); 

     for(int j = 0; j < tokens.length; j++) 
      outFile.format("%s\r\n", tokens[j]); 
    } 
} 

public void closeFiles() 
{ 
    if(inFile != null) 
     inFile.close(); 

    if(outFile != null) 
     outFile.close(); 
} 
} 

のように見えるようになります。私の括弧は、netbeansで正しくフォーマットされましたが、私はコードブロックに保持するために下のものを移動しなければならなかった

+0

これは宿題のように聞こえるので、私はそのタグを付け加えました。 –

+0

これまでのソリューションで直面している特定の問題に基づいて、特定の質問をする必要があります。あなたはいくつかのコードを書いていますが、それがどのように機能していないのかについては何の示唆もしていません。私はあなたのコードが動作していないと思うが、あなたは本当に質問していない。 – digitaljoel

答えて

1

これは宿題だと思うので、私はあなたに解決策を与えるのを避けるが、何をすべきかのヒントを与える。

行を読み終えたら、都市、州で構成されます。したがって、最初に行う必要があるのは、文字列を2つの部分に分割することです。第2部分は州であり、第1部分は都市です。あなたは、各都道府県のためのコレクションを作成し、正しい都道府県のコレクションに市を格納する必要があります。

見つけた県の名前を並べ替えて、それを繰り返します。都道府県の都市を並べ替えて、都道府県名と都道府県名を出力します。

有用なクラスは、HashMap、TreeMap、List、Collections(ソートメソッドを持つ)になります。

あなたをさらに助けてくれることを願っています。そうでない場合は、どこにいらっしゃったのですか。

+0

Map >結果; // MapとListのタイプを注意深く選択すると、人生はケーキのようになります。 result.put(province、cityNames.add(newName)); 正規表現グループマッチャーは、解析を簡単にします。実装するコードの先頭行数:15 –

関連する問題