矩阵表与Hashmap打印

时间:2016-03-07 15:13:16

标签: java matrix hashmap duplicates

死Stackoverflow,

我通过Hadoop将代码作为赋值来编写从文本文件中读取的值的Matrix表。基本上它必须读取角色在某个其他角色之后出现的次数。

我已经通过hadoop中的代码获得了这些价值,并将它们放入一个hashmap>并将它们传递给名为频率表的函数:

 public void FrequencieTable(HashMap<Character, HashMap<Character,Integer>> charFrequentie){
    String theRowList = "";
    String theColumnList = "";
    for(Character row : charFrequentie.keySet()){
        theRowList += "\n" + row;
        for(Character column : charFrequentie.get(row).keySet()) {
            theColumnList += column.charValue() + "\t";
            theRowList += "\t" +  charFrequentie.get(row).get(column);
        }

        System.out.println("\t" + theColomList +  "\n");
        System.out.println(theRowList);
    }
}

只有这会产生错误的输出,因为它应该只显示每个单独的字符,例如&#34; H&#34;一旦在一行和一列上,如果没有任何数据,它应该显示0。

基本上它给出了这个输出:

    u   s   a   o   e   m   g   d   t   n   j   t   a   n   g   t   e   m   a   t   e   e   a   o   e   u   s   g   l   j   k   


g   1   1   2   2
d   1   1
e   1   2   2   1   1
a   2   2   3
n   2   2
o   2   1

虽然它应该是这样的:(没有重复)

    u   s   a   o   e   m   g   d   t   n   j   
g   0   0   0   0   0   0   0   1   1   2   2
d   1   1   0   0   1   0   3   0   0   0   0

有人知道我们应该怎么做吗?我们完全无能为力。

谢谢你

1 个答案:

答案 0 :(得分:0)

我不知道您的数据应该代表什么,但基本问题似乎是您的内循环:

for(Character column: charFrequentie.get(row).keySet()){
    theColumnList += column.charValue() + "\t";
    theRowList += "\t" +  charFrequentie.get(row).get(column);
}

如果它存在于多行的映射中,您可以将相同的字符添加到列列表中,例如如果你有a-> c和b-> c的频率,你的列列表中有两次c。

除此之外,您需要在映射中以相同的顺序迭代所有字符。您目前只使用每行的值,因为您不知道他们在哪个列中,您无法用0填充其他列。

要解决此问题,您必须循环两次(否则您可能会错过顶行中的尾随零):

  • 一次获取所有列
  • 一次实际打印行

列的顺序要么必须提供/定义,要么取决于映射中的顺序。

示例:

//Step 1: collect all the columns that have values
Set<Character> columns = new LinkedHashSet<>();
for(Character row : charFrequentie.keySet()){
  //gets the mapped characters for the row and adds them in the order they are returned ignoring any duplicates 
  columns.addAll(charFrequentie.get(row).keySet());
}

//Step 2: print
for( Character col : columns ) {
  //print the columns as the first line
}

//here you iterate over the rows since you'll print line by line
for(Character row : charFrequentie.keySet()){
  //go over the columns in the same order for each row
  for( Character col : columns ) {
    //get the frequency for the column in that row, which might be null       
    Integer frequency = charFrequentie.get(row).get(col);

    //if there is no value for the column in the current row just print 0
    if( frequency == null ) {
      //print 0
    } else {
      //there is a frequency value so just print it         
    }
  }
}

关于列及其排序的两个注释:

  • 由于您只提供了哈希图,因此您无法确定列的顺序(LinkedHashSet的顺序将由地图返回,但由于哈希地图通常不会定义,因此仍然无法定义; t定义订单。如果您需要特定订单,则必须对列进行排序(然后使用排序集)或手动提供。
  • 如果您没有频率为0的条目,则不会获得任何包含全零的列,例如om只有0值的示例。在这种情况下,您必须手动提供它们以获取没有频率数据的列。

修改

为了使示例更清楚,假定以下输入数据(格式:行,列,频率)

a,a,1
a,b,5
a,c,3
b,a,5
b,e,7

这将导致列集按任意顺序具有值abce(因为您使用的是散列图)。

输出看起来像这样(由于使用了hashmaps,顺序可能会有所不同,我只是使用随机顺序):

  b e a c
b 0 7 5 0  
a 5 0 1 3