0

我通过以下方式在哈希表中有数据:

key : year    value : 2011  2011
key : title   value : Almayer's Folly     Faust

我有两个由制表符空格分隔的键和值。

我需要以下列方式输出。

Year     Title
2011     Almayer's Folly
2011     Faust

我怎样才能以所需的方式解析哈希表中的数据?

4

4 回答 4

1

这对我有用,但你必须每年都有一个标题,每个标题都有一年

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
于 2012-06-26T17:46:12.683 回答
0

这很简单,您可以使用一组键迭代 HashTable:

System.out.println("Year\tTitle");
keys = table.keySet();
for (String key : keys)
    System.out.println(key + "\t" + table.get(key);

假设年份是一个字符串。

于 2012-06-26T16:28:03.320 回答
0

首先,您的方法是管理这种结构的一种非常脆弱的方式。至少您应该将值设为某种列表。我怀疑这是您想要解决的某种练习/家庭作业之类的问题。

话虽如此,我将以伪代码的方式用 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()
}

一个正面的方法,使用原始数据和非常有用的扫描仪。

于 2012-06-26T16:58:15.770 回答
0

您存储数据的方法很糟糕。在您的表格中,您基本上表明您将使用 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.mapjava.util.HashMap的开头。以及查找哈希表的用途和用途,更具体地说,如何处理冲突(一旦您学习了如何正确使用哈希表,您就会拥有)。

于 2012-06-26T17:16:08.790 回答