我通过以下方式在哈希表中有数据:
key : year value : 2011 2011
key : title value : Almayer's Folly Faust
我有两个由制表符空格分隔的键和值。
我需要以下列方式输出。
Year Title
2011 Almayer's Folly
2011 Faust
我怎样才能以所需的方式解析哈希表中的数据?
这对我有用,但你必须每年都有一个标题,每个标题都有一年
Hashtable<String, String> map = new Hashtable<String, String>();
map.put("Year", "2011 2011");
map.put("Title", "Almayer's Folly Faust");
String[] rows = null;
for (String key : map.keySet()) {
String value = map.get(key);
String[] elements = value.split("\t");
if (rows == null) {
rows = new String[elements.length + 1]; // Element rows + Title row
for (int i = 0; i < rows.length; i++) {
rows[i] = "";
}
}
String prefix = "";
if (!rows[0].equals("")) { // On first append no tab
prefix = "\t";
}
rows[0] += prefix + key; // append Title
for (int i = 1; i < rows.length; i++) {
rows[i] += prefix + elements[i - 1]; // Append Data
}
}
for (String row : rows) {
System.out.println(row);
}
输出:
Year Title
2011 Almayer's Folly
2011 Faust
这很简单,您可以使用一组键迭代 HashTable:
System.out.println("Year\tTitle");
keys = table.keySet();
for (String key : keys)
System.out.println(key + "\t" + table.get(key);
假设年份是一个字符串。
首先,您的方法是管理这种结构的一种非常脆弱的方式。至少您应该将值设为某种列表。我怀疑这是您想要解决的某种练习/家庭作业之类的问题。
话虽如此,我将以伪代码的方式用 Tony 的评论扩展 pb2q 的答案。
结构中的制表符对您想要的输出毫无用处,因此它们只会用作分隔符。
System.out.println("Year\tTitle");
keys = table.keySet();
Map<Scanner> scanners = new Map<Scanner>();
for (String key : keys){
// Here comes the trick
scanners[i] = new Scanner( table.get(key) ).useDelimiter("\t");
}
-Print headings.
//Now you can pull elements from each scanner until they are empty.
boolean hasMoreElements = true;
while( hasMoreElements ){
for ( key : keys){
print scanners[key].next()
}
printLine
hasMoreElements = scanners[key].hasNext()
}
一个正面的方法,使用原始数据和非常有用的扫描仪。
您存储数据的方法很糟糕。在您的表格中,您基本上表明您将使用 2011 作为您的密钥……就这样做吧!
另一个问题是您不应该在地图中使用制表符来分隔不同的数据。更合乎逻辑的一种更简单的方法是将制表符分隔的数据存储在列表中,没有制表符。
这是您尝试做的事情,表明您可以在将内容添加到地图之前或之后将其添加到列表中。
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
ArrayList<String> titles2011 = new ArrayList<String>();
titles2011.add("Almayer's Folly");
map.put("2011", titles2011);
map.get("2011").add("Faust");
System.out.println("Year\tTitle");
for (String year : map.keySet()) {
for (String title : map.get(year)) {
System.out.println(year+"\t"+title);
}
}
我还建议阅读java.util.map和java.util.HashMap的开头。以及查找哈希表的用途和用途,更具体地说,如何处理冲突(一旦您学习了如何正确使用哈希表,您就会拥有)。