scala程式碼(二)
最近看PrefixSpan 原始碼,自己用java重新寫了,兩個問題浪費了不少時間。
1:scala的操作符如果沒有賦值,那麼是不影響原來的資料結構。可以看成是不可變類。
如ReversedPrefix add(int item)
{
assert(item != 0);
List<Integer> newItems = new ArrayList<Integer>(items);
if (item < 0)
{
newItems.add( 0,-item );
return new ReversedPrefix(newItems, length + 1);
}
else
{
newItems.add( 0,0 );
newItems.add( 0,item );
return new ReversedPrefix(newItems, length + 1);
}
}
我原來直接用items,沒有new List,趙成錯誤。
2:排序的寫法的問題。計算結果都是對的,但是顯示的次序不對,我的是升序,但是原始碼是降序,排查了一天,懷疑一切,把所有的原始碼的API都測試了一遍,就是不對。後來肯定是排序的升序和降序問題,再看程式碼,
scala的程式碼,val freqItems = freqItemAndCounts.sortBy(-_._2).map(_._1),
原來-_._2 是降序排序,前面有一個減號。根本沒注意。