将频率应用于数组中的元素
Apply a Frequency to an Element in an Array
我正在尝试制作一个脚本,该脚本将采用一组单词(自定义 class),按文本值的字母顺序将它们组织成一个数组(这部分有效)。从这里开始,我将计算它前面有多少词与它相同,这将是所有这些相似词的出现频率。然后它继续这样做,直到数组中的每个元素都被分配了一个频率。从这里开始,它将元素重新排序回其原始位置,提供了一个保存其原始元素顺序的预存储变量。这是代码:
public void setFrequencies() {
List<Word> dupeWordList;
dupeWordList = new ArrayList<>(wordList);
dupeWordList.removeAll(Collections.singleton(null));
Collections.sort(dupeWordList, (Word one, Word other) -> one.getValue().compareTo(other.getValue()));
int count;
int currElement;
for(currElement = 0; currElement < dupeWordList.size(); currElement++) {
count = 1;
Word tempWord = dupeWordList.get(currElement);
tempWord.setFrequency(count);
if(currElement+1 <= dupeWordList.size() - 1) {
Word nextWord = dupeWordList.get(currElement+1);
while(tempWord.getValue().equals(nextWord.getValue())) {
count++;
currElement++;
tempWord.setFrequency(count);
for(int e = 0; e < count - 1; e++) {
Word middleWord = new Word();
if(currElement-count+2+e < dupeWordList.size() - 1) {
middleWord = dupeWordList.get(currElement-count+2+e);
}
middleWord.setFrequency(count);
}
if(currElement+1 <= dupeWordList.size() - 1) {
nextWord = dupeWordList.get(currElement+1);
} else {
break;
}
}
break;
}
}
List<Word> reSortedList = new ArrayList<>(wordList);
Word fillWord = new Word();
fillWord.setFrequency(0);
fillWord.setValue(null);
Collections.fill(reSortedList, fillWord);
for(int i = 0; i < dupeWordList.size(); i++) {
Word word = dupeWordList.get(i);
int wordOrder = word.getOrigOrder();
reSortedList.set(wordOrder, word);
}
System.out.println(Arrays.toString(DebugFreq(reSortedList)));
setWordList(reSortedList);
}
public int[] DebugFreq(List<Word> rSL) {
int[] results = new int[rSL.size()];
for(int i=0; i < results.length; i++) {
results[i] = rSL.get(i).getFrequency();
}
return results;
}
如您所见,我在底部设置了一些调试方法。当我 运行 此方法显示每个单词的频率为 1 时。我在代码中看不到问题,也没有出现任何错误。请记住,我已经让它显示了排序后的 dupeWordList,它确实按字母顺序排列并且它们是连续的重复元素,所以这不应该发生。
所以如果我理解正确..下面的代码将是你的解决方案。
好的,您有一个列表,其中包含按字母顺序排序的字符串(术语或单词)。
// Okay the below list is already sorted in alphabetical order.
List<String> dupeWordList = new ArrayList<>(wordList);
要计算列表中单词的出现频率,Map<String, Integer>
可能会对您有所帮助。
//Take a Map with Integer as value and String as key.
Map<String,Integer> result = new HashMap<String,Integer> ();
//Iterate your List
for(String s : dupeWordList)
{
if(map.containskey(s))
{
map.put(s,map.get(s)+1);
// Please consider casting here.
}else
{
map.put(s,1);
}
}
好的,现在我们有一个 map
,它将您的单词或术语的频率作为地图中的值。
希望对您有所帮助。
我正在尝试制作一个脚本,该脚本将采用一组单词(自定义 class),按文本值的字母顺序将它们组织成一个数组(这部分有效)。从这里开始,我将计算它前面有多少词与它相同,这将是所有这些相似词的出现频率。然后它继续这样做,直到数组中的每个元素都被分配了一个频率。从这里开始,它将元素重新排序回其原始位置,提供了一个保存其原始元素顺序的预存储变量。这是代码:
public void setFrequencies() {
List<Word> dupeWordList;
dupeWordList = new ArrayList<>(wordList);
dupeWordList.removeAll(Collections.singleton(null));
Collections.sort(dupeWordList, (Word one, Word other) -> one.getValue().compareTo(other.getValue()));
int count;
int currElement;
for(currElement = 0; currElement < dupeWordList.size(); currElement++) {
count = 1;
Word tempWord = dupeWordList.get(currElement);
tempWord.setFrequency(count);
if(currElement+1 <= dupeWordList.size() - 1) {
Word nextWord = dupeWordList.get(currElement+1);
while(tempWord.getValue().equals(nextWord.getValue())) {
count++;
currElement++;
tempWord.setFrequency(count);
for(int e = 0; e < count - 1; e++) {
Word middleWord = new Word();
if(currElement-count+2+e < dupeWordList.size() - 1) {
middleWord = dupeWordList.get(currElement-count+2+e);
}
middleWord.setFrequency(count);
}
if(currElement+1 <= dupeWordList.size() - 1) {
nextWord = dupeWordList.get(currElement+1);
} else {
break;
}
}
break;
}
}
List<Word> reSortedList = new ArrayList<>(wordList);
Word fillWord = new Word();
fillWord.setFrequency(0);
fillWord.setValue(null);
Collections.fill(reSortedList, fillWord);
for(int i = 0; i < dupeWordList.size(); i++) {
Word word = dupeWordList.get(i);
int wordOrder = word.getOrigOrder();
reSortedList.set(wordOrder, word);
}
System.out.println(Arrays.toString(DebugFreq(reSortedList)));
setWordList(reSortedList);
}
public int[] DebugFreq(List<Word> rSL) {
int[] results = new int[rSL.size()];
for(int i=0; i < results.length; i++) {
results[i] = rSL.get(i).getFrequency();
}
return results;
}
如您所见,我在底部设置了一些调试方法。当我 运行 此方法显示每个单词的频率为 1 时。我在代码中看不到问题,也没有出现任何错误。请记住,我已经让它显示了排序后的 dupeWordList,它确实按字母顺序排列并且它们是连续的重复元素,所以这不应该发生。
所以如果我理解正确..下面的代码将是你的解决方案。
好的,您有一个列表,其中包含按字母顺序排序的字符串(术语或单词)。
// Okay the below list is already sorted in alphabetical order.
List<String> dupeWordList = new ArrayList<>(wordList);
要计算列表中单词的出现频率,Map<String, Integer>
可能会对您有所帮助。
//Take a Map with Integer as value and String as key.
Map<String,Integer> result = new HashMap<String,Integer> ();
//Iterate your List
for(String s : dupeWordList)
{
if(map.containskey(s))
{
map.put(s,map.get(s)+1);
// Please consider casting here.
}else
{
map.put(s,1);
}
}
好的,现在我们有一个 map
,它将您的单词或术语的频率作为地图中的值。
希望对您有所帮助。