死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
有人知道我们应该怎么做吗?我们完全无能为力。
谢谢你
答案 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定义订单。如果您需要特定订单,则必须对列进行排序(然后使用排序集)或手动提供。o
和m
只有0值的示例。在这种情况下,您必须手动提供它们以获取没有频率数据的列。修改强>
为了使示例更清楚,假定以下输入数据(格式:行,列,频率)
a,a,1
a,b,5
a,c,3
b,a,5
b,e,7
这将导致列集按任意顺序具有值a
,b
,c
,e
(因为您使用的是散列图)。
输出看起来像这样(由于使用了hashmaps,顺序可能会有所不同,我只是使用随机顺序):
b e a c
b 0 7 5 0
a 5 0 1 3