2012-06-26 5 views
0

У меня есть данные в хэш-таблице в следующем виде:нужно анализировать данные в Hashtable

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

У меня есть два ключа и значения, разделенные пробелами закладках.

Мне нужно, чтобы мой результат был следующим образом.

Year  Title 
2011  Almayer's Folly 
2011  Faust 

Как я могу разобрать данные в хэш-таблице в требуемом порядке ??

+0

Домашнее задание? Если это так, вы должны пометить его как таковой. Кроме того, что вы пробовали до сих пор и с какими проблемами вы сталкиваетесь? – maasg

ответ

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 
+0

+0 Поздравляем за то, что вы сделали чужой домашнее задание, не оспаривая OP, чтобы приложить усилия в первую очередь. – maasg

0

Это очень просто, вы можете перебрать HashTable, используя набор ключей:

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

Предполагая, что год является строкой.

+0

Конечно, это только половина проблемы. После получения ключа используйте этот ключ, чтобы получить значение String, а затем проанализируйте строку, используя вкладку в качестве разделителя. – Tony

0

Во-первых, ваш подход является очень хрупким способом управления подобной структурой. По крайней мере, вы должны сделать значения своего рода List. Я подозреваю, что это какое-то упражнение/домашнее задание, как проблема, которую вы хотите решить.

Это, как говорится, будет расширять ответ 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() 
} 

Голова на подходе, используя исходные данные с удивительно полезным сканером.

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.map и java.util.HashMap. Как и для того, чтобы посмотреть, как и для чего стоит hash table, а точнее, как бороться с коллизиями (что у вас будет, как только вы узнаете, как правильно использовать хеш-таблицу).

Смежные вопросы