java - 将频率应用于数组中的元素

标签 java arrays sorting frequency

我正在尝试制作一个脚本,该脚本将采用一组单词(自定义类),并按其文本值按字母顺序将它们组织到一个数组中(这部分有效)。从这里开始,我将计算它前面有多少个术语与它相同,这将是所有这些相似术语的频率。然后它继续这样做,直到数组中的每个元素都被分配了一个频率。从这里开始,它会将元素重新排序回其原始位置,并提供一个保存其原始元素顺序的预存储变量。这是代码:

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它将您的单词或术语的频率作为 map 中的值。

希望有帮助。

关于java - 将频率应用于数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31040827/

相关文章:

java - 专门针对 double 和浮点精度的 java 类

java - Java中逆时针旋转图像90度

c++ - 缺少大小的数组与指针

c - 将数组传递给c中的函数

java - ArrayList 上的 Collections.sort() 似乎无法正确排序

c - 在C中用大写和小写字母对字符串数组进行排序

java - PHP 在 Ubuntu 上运行 jar 文件

javascript - 如何解析 JSONArray 并在 Javascript 中进行转换

java - 对日期 ListArray 以及标题的第二个数组进行排序

java - 在 Java 中永久保存数据(并自动加载)?