2017-03-26 8 views
0

ここで最も大きな問題は、ハッシュマップを理解していないことと、いくつかのチュートリアルを見ても操作する方法です。うまくいけば、あなたは賢明な魂が正しい軌道で私を指すことができるようになります。.txtファイルをハッシュマップに読み込んで操作する

私は.txtファイルをハッシュマップに読み込もうとしています。テキストファイルには、2006年の名前の人気があります。inputFileの各行には、男の子の名前と女の子の名前とその名前がいくつ含まれています。例えば、1 Jacob 24,797 Emily 21,365は、1行目のファイルからの入力です。

男の子の名前を1つのリストに入れ、女の子の名前を2番目のリストに入れて、現在の位置を維持してユーザージャコブを検索して、その年の第1位の男の子名だったと言われます。他の名前についても同様です。以前は、ファイルを1行ずつ読み込んでいて、そのファイルに含まれていたファイル名の行を探していました。これはうまくいきましたが、男の子の名前か女の子の名前なのかわからず、ジェイコブが女の子のためにどれほど人気が​​あるのか​​を探していたとしたら、それはまだ1番です。これを回避するには最良の方法ですが、実際にはそれを動作させることはできません。

マイコード

public void actionPerformed(ActionEvent e) 
    { 
     //Parse Input Fields 
     String name = inputArea.getText(); 
     if (name.equals("")) 
     { 
      JOptionPane.showMessageDialog(null, "A name is required.", "Alert", JOptionPane.WARNING_MESSAGE); 
      return; 
     } 
     String genderSelected = genderList.getSelectedItem().toString(); 
     String yearSelected = yearList.getSelectedItem().toString(); 

     String yearFile = "Babynamesranking"+yearSelected+".txt"; //Opens a different name file depending on year selection  
     boolean foundName = false; 
     Map<String, String> map = new HashMap<String,String>(); //Creates Hashmap 

     try 
     { 
      File inputFile = new File(yearFile);     //Sets input file to whichever file chosen in GUI 
      FileReader fileReader = new FileReader(inputFile);  //Creates a fileReader to open the inputFile 
      BufferedReader br = new BufferedReader(fileReader);  //Creates a buffered reader to read the fileReader 

      String line; 
      int lineNum = 1;          //Incremental Variable to determine which line the name is found on 
      while ((line = br.readLine()) != null) 
      { 
       if (line.contains(name)) 
       { 
        outputArea.setText(""+name+" was a popular name during "+yearSelected+"."); 
        outputArea.append("\nIt is the "+lineNum+" most popular choice for "+genderSelected+" names that year."); 
        foundName = true; 
       } 
       String parts[] = line.split("\t"); 
       map.put(parts[0],parts[1]); 

       lineNum++; 
      } 
      fileReader.close(); 
     } 
     catch(IOException exception) 
     { 
      exception.printStackTrace(); 
     } 

     String position = map.get(name); 
     System.out.println(position); 
} 

サンプルで、inputFile:

1 Jacob 24,797 Emily 21,365 
2 Michael 22,592 Emma 19,092 
3 Joshua 22,269 Madison  18,599 
4 Ethan 20,485 Isabella 18,200 
5 Matthew 20,285 Ava  16,925 
6 Daniel 20,017 Abigail  15,615 
7 Andrew 19,686 Olivia 15,474 
8 Christopher 19,635 Hannah 14,515 
+0

男の子の名前の後に女の子の名前が続く場合や、逆の場合がありますか? –

+0

これはいつものケースです – Justiciar

+0

(男の子が選ばれている)場合は[0]、それ以外の場合は[1]を見てください。 – ndlu

答えて

0

さて、問題は名前が、それは男の子の名前や女の子の名前だ場合については、全体のライン内に存在する場合

if (line.contains(name)) 

を使用してあなたがチェックしているということです。あなたができることは、それらを別々に読んでから、チェックしたい値を決めることです。名前は、男の子か女の子のためであるかどうかを知ることができるように

while ((line = br.readLine()) != null) 
{ 
    Scanner sc = new Scanner(line); 
    int lineNumber = sc.nextInt(); 
    String boyName = sc.next(); 
    int boyNameFreq = sc.nextInt(); 
    String girlName = sc.next(); 
    int girlNameFreq = sc.nextInt(); 

    if(genderSelected.equals("male") && name.equals(boyName)){ 
     // .. a boy's name is found 
    } 
    else if(genderSelected.equals("female") && name.equals(girlName)){ 
     // .. a girl's name is found 
    } 

} 

Scannerクラスは、行を解析し、トークンごとにそれを読むのに使用されて:あなたはこのような何かを行うことができます。次に、必要な名前だけを確認します。

+0

2つのifではなく{if else if {}を使用する方が意味があります。 – ndlu

+0

いいえ、{}の条件を満たさない条件はすべてelse文を実行するためです。したがって、あなたが名前と一致しない名前を持っている場合は、else文でその条件をチェックしていないので、それが女の子の名前と一致しなくても直接elseブロックを実行します。 –

+0

これは、ハッシュマップを使用して周りに私を得るかもしれないように見えます。しかし、元々あなたが持っていたものとランタイムエラーがありました。コンパイルされたが実行時にクラッシュした。 intの値をdoubleに変更しなければならなかった。 – Justiciar

0

は、次の2つのハッシュマップ、男の子のための1つの名前と女の子のための1の名前をお勧めします - 現在、あなたは男の子を使用しています名前としてキーと女の子の名前として、あなたが望むものではない値として。代わりに、2つのMap<String, IntTuple>データ構造を使用してください。Stringは名前で、IntTupleは行番号(ランク)であり、この名前を持つ人の数です。

class IntTuple { 
    final int rank; 
    final int count; 

    IntTuple(int rank, int count) { 
    this.rank = rank; 
    this.count = count; 
    } 
} 
+0

それは理にかなっています。私は少し "キー"で混乱していた。私はそのコードで演奏します – Justiciar

+0

彼のコードに基づいて、2人のハッシュマップを作成する必要はありません。なぜなら、フロントエンドユーザーは既にセックスを選択しているため、ハッシュマップが1つだけで済むからです。 – ndlu

+0

@Justiciarキーは値を調べるために使用します。たとえば、ハッシュマップに "1,24,797"のIntTuple値にマップされた "Jacob"キーが含まれている場合、 "map.get(" Jacob ")"が返されます"1,24,797"の値 –

関連する問題