我目前正在做一个小小的" Hangman"项目。我想让用户可以从不同的类别中进行选择,例如"国家"或"食物"这让我想到了处理和分类这些类别的最佳方法。
我将这些单词保存到一个小文本文件中,看起来像这样:
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) );
}
现在我使用的这种方法非常精细,对我来说似乎有点过于复杂,我想知道,如果有更简单的方法可以做到这一点。我想提前感谢你能给我的任何建议。
答案 0 :(得分:4)
最好使用Map<String, List<String>>
来赚钱。 Map可以是HashMap,单词category是关键,而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]