1

私は現在、小さな「ハングマン」プロジェクトに取り組んでいます。ユーザーが「国」や「食べ物」など、さまざまなカテゴリから選択できるようにしたいので、これらのカテゴリを処理して並べ替えるにはどうすればよいかを考えました。

単語を小さなテキスト ファイルに保存すると、次のようになります。

Countries: Hungary Austria Argentina Canada;
Food: Donut Bread Hamburger;

今のところ、すべての単語を格納する多次元 ArrayList を作成し、各カテゴリをその ArrayList 内の個々の ArrayList に格納します。

ArrayList< ArrayList<String> > words = new ArrayList< ArrayList<String> >();

// ... read words from .txt file and store it in the words-ArrayList ...

各カテゴリの最初の単語はカテゴリのタイトルであることを知っているので、カテゴリのすべてのタイトルを取得したい場合は、次のようになります。

for( ArrayList list : words ) {
    System.out.println( list.get(0) );
}

今、私が使用しているこの方法は完全にうまく機能しますが、私には少し複雑すぎるように思われ、それを行うためのより簡単な方法があるかどうか疑問に思っていました. あなたが私に与えることができる提案を前もって感謝したいと思います。

4

1 に答える 1

4

Map<String, List<String>>自分のお金に使ったほうがいい。Map は HashMap にすることができ、カテゴリという単語がキーになり、List (具象形式の ArrayList) が関連する値になります。

次に、カテゴリを抽出するために必要なことは、キー セットを抽出して反復処理することだけです。例えば、

  Map<String, List<String>> mapList = new HashMap<String, List<String>>();

  // fill map here...

  for (String key : mapList.keySet()) {
     List<String> list = mapList.get(key);

     System.out.printf("%s: %s%n", key, list);
  }

キーを特定の順序にしたい場合は、TreeMap など、Map の他の具体的な実装のいずれかを使用する必要があります。

簡単な例:

import java.io.InputStream;
import java.util.*;

public class MapList {
   public static void main(String[] args) {
      Map<String, List<String>> mapList = new HashMap<String, List<String>>();

      String sourcePath = "MapListData.txt";
      InputStream source = MapList.class.getResourceAsStream(sourcePath);
      if (source == null) {
         return;
      }
      Scanner scan = new Scanner(source);
      while (scan.hasNextLine()) {
         String line = scan.nextLine().trim();
         if (!line.isEmpty()) {
            line = line.replace(";", "");
            String[] mainTokens = line.split("\\s*:\\s*");
            if (mainTokens.length == 2) {
               String key = mainTokens[0];
               List<String> list = new ArrayList<String>();
               String[] subTokens = mainTokens[1].split("\\s+");
               for (String subToken : subTokens) {
                  list.add(subToken);
               }
               mapList.put(key, list);
            }
         }
      }

      if (scan != null) {
         scan.close();
      }

      for (String key : mapList.keySet()) {
         List<String> list = mapList.get(key);

         System.out.printf("%s: %s%n", key, list);
      }
   }
}

私にとっては戻ります:

Beer: [Pilsner, Weiss, Brown_Ale, IPA]
Countries: [Hungary, Austria, Argentina, Canada]
Food: [Donut, Bread, Hamburger]
于 2013-04-01T01:59:49.030 に答える