2010-01-13 91 views
2

我正面临一个问题。我用下面的HashMap来存储一些值Java HashMap到Matrix

HashMap<String, Object> hm = new HashMap<String, Object>(); 

的对象是另一个HashMap的(是的,你可以说的HashMap的HashMap中)。字符串用于存储书名,Object又是存储作者姓名和作者数量的另一个散列表。所以它可以看起来像(Xyz book {authname,numberOfAuthors})。现在我想把这个hashmap打印成NxN矩阵。有没有我可以使用的默认功能?如果不是,那么任何人都可以告诉我任何暗示以简单的方式做到这一点?因为我不想使用这么多循环,如果条件(它会杀死系统)。

谢谢!

+0

我试图编写hashmap结构,但按下提交按钮。没有任何关于我写的代码声明:(可能是它不允许编写代码) – user238384 2010-01-13 01:08:11

+0

当你编写代码时,你需要标记它并点击'101010'按钮来编码它 – 2010-01-13 01:09:39

+0

那或手动缩进至少4个空格的所有代码 – 2010-01-13 01:10:12

回答

2

绝对没有内置函数来做到这一点。

您需要做的第一件事就是找出二级地图中的唯一键并将它们分配给列。也许你已经知道他们(如果他们是固定的),否则你必须循环所有人一次,并收集在一个集合。

如果您确实拥有固定键,则应考虑取消二级映射,并为此(书籍)使用Java bean类。

如果你真的要打印矩阵,你需要考虑格式,主要是列宽。再次,这也可以先验地修正,或者你可以看看数据(全部或样本)来弄清楚。

暂时忽略格式化后,您可以输出类似于CSV的内容,然后循环显示地图(理想情况下按照排序的键顺序),并为每个条目(书籍)输出一行。在每一行中,您将循环遍历列(键列表)并输出每个字段。

+1

...并且循环和条件不可能“杀死系统”。把它写成@Thilo的建议,只有这样,如果你看到性能问题,就开始担心性能。即使有内置的方式,这种方式会在内部使用相同的循环和条件,因此性能将与明显的手动方法大致相同。 – 2010-01-13 01:23:48

3

看起来你没有充分利用的潜力OO ...你可以创建自己的Book类和重写toString()打印所有领域..​​.

public class Book{ 
    private String bookName; 
    private String authorName; 
    ... 
    @Override 
    public String toString() { 
     return String.format("%s written by %s",bookName,authorName); 
    } 
} 

通过这种方式你的图书馆将是这样的:

Map<String, Book> myLibrary = new HashMap<String, Book>(...); 

,并打印所有库,您将需要一个简单的循环:

for(Book b : myLibrary.values()) { 
     System.out.println(b); 
    }