【问题标题】:Best way to create categories with words用词创建类别的最佳方法
【发布时间】:2013-03-22 03:02:49
【问题描述】:

我目前正在做一个小小的“刽子手”项目。我想让用户能够从不同的类别中进行选择,例如“国家”或“食物”,这让我开始思考什么是处理和排序这些类别的最佳方式。

我将单词保存到一个小文本文件中,如下所示:

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

现在我使用的这种方法非常好用,但对我来说似乎有点太复杂了,我想知道是否有更简单的方法可以做到这一点。我要提前感谢您能给我的任何建议。

【问题讨论】:

  • 类别的数量是否被限制为 32 或 64 个,或者您希望评分者拥有无限数量的类别?
  • 它将是无限的,因此用户也可以添加类别,如果他愿意的话。

标签: java store categories words


【解决方案1】:

为了我的钱,最好使用Map&lt;String, List&lt;String&gt;&gt;。 Map 可以是 HashMap,单词 category 是 key,而 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);
  }

如果您希望键按特定顺序排列,则需要使用 Map 的其他具体实现之一,例如 TreeMap。

举个简单的例子:

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]

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多