Java 树集比较没有给出理想的结果

Java 树集比较没有给出理想的结果,java,comparable,treeset,Java,Comparable,Treeset,我正在尝试创建一套字典中所有单词中的所有字母 我使用树集,因为我必须做很多比较操作 public class main { public static void main(String[] args) { Set<String> lines = new TreeSet<>(); lines.add("ba"); DictAwareSolver myGuesser = new DictAwar

我正在尝试创建一套字典中所有单词中的所有字母

我使用树集,因为我必须做很多比较操作


public class main {

    public static void main(String[] args) {

        Set<String> lines = new TreeSet<>();
        lines.add("ba");
        DictAwareSolver myGuesser = new DictAwareSolver(lines);
        myGuesser.makeGuess();
    }
}

公共班机{
公共静态void main(字符串[]args){
设置行=新树集();
行。添加(“ba”);
DictawResolver myGuesser=新的DictawResolver(行);
myGuesser.makeGuess();
}
}
这是我的班,正在现场操作

package solver;

import sun.reflect.generics.tree.Tree;

import java.util.*;
import java.lang.System;

public class DictAwareSolver extends HangmanSolver
{

    private Set<String> dict;


    TreeSet<Node> myTree = new TreeSet<>();


    //getters

    public Set<String> getDict() {
        return dict;
    }
    


    // methods

    public DictAwareSolver(Set<String> dictionary) {
        this.dict = dictionary;
        // Implement me!
    } // end of DictAwareSolver()


    @Override
    public void newGame(int[] wordLengths, int maxIncorrectGuesses)
    {
        // Implement me!
    } // end of newGame()


    @Override
    public char makeGuess() {
        Set<String> guessDict = getDict();

        Iterator dictItr = guessDict.iterator();

        while (dictItr.hasNext())
        {
            String word = (String) dictItr.next();

            for (int i = 0; i<word.length(); i++)
            {
                Node temp = new Node(word.charAt(i));
                myTree.add(temp);
            }
        }

        Iterator treeItr = myTree.iterator();

        while (treeItr.hasNext())
        {
            Node n = (Node) treeItr.next();
            System.out.println(n.getLetter() + "-->"+n.getFrequency());
        }
        // TODO: This is a placeholder, replace with appropriate return value.
        return '\0';
    } // end of makeGuess()


    @Override
    public void guessFeedback(char c, Boolean bGuess, ArrayList< ArrayList<Integer> > lPositions)
    {
        // Implement me!
    } // end of guessFeedback()

} // end of class DictAwareSolver

class Node implements Comparable<Node>{
    private char letter;
    private int frequency;

    public Node(char letter)
    {
        this.letter = letter;
        this.frequency = 1;
    }

    public void countIncrementer()
    {
        int newCount = getFrequency()+1;
        setFrequency(newCount);
    }

    // getters

    public char getLetter() {
        return letter;
    }

    public int getFrequency() {
        return frequency;
    }

    // setters


    public void setFrequency(int frequency) {
        this.frequency = frequency;
    }

    @Override
    public int compareTo(Node o) {
        if (getLetter() == o.letter)
        {
            o.countIncrementer();
            return 0;
        }
        else if (getLetter() > o.getLetter())
        {
            return 1;
        }
        else
        {
            return -1;
        }
    }
}
包求解器;
导入sun.reflect.generics.tree.tree;
导入java.util.*;
导入java.lang.System;
公共类DictAwareSolver扩展HangmanSolver
{
私自录音;
TreeSet myTree=新树集();
//吸气剂
公共集getDict(){
返回命令;
}
//方法
公共DictAwareSolver(集合字典){
this.dict=字典;
//实施我!
}//dictawarolver()的结尾
@凌驾
public void newGame(int[]字长,int maxIncorrectGuesses)
{
//实施我!
}//newGame()的结尾
@凌驾
公共字符makeGuess(){
设置guessDict=getDict();
迭代器dictr=guessDict.Iterator();
while(dictr.hasNext())
{
字符串字=(字符串)dictr.next();
对于(int i=0;i l位置)
{
//实施我!
}//猜测反馈()结束
}//类结束dictawarolver
类节点实现了可比较的{
私人信件;
专用整数频率;
公共节点(字符字母)
{
这个字母=字母;
这个频率=1;
}
public void countIncrementer()
{
int newCount=getFrequency()+1;
设置频率(新计数);
}
//吸气剂
公共字符getLetter(){
回信;
}
公共int getFrequency(){
返回频率;
}
//二传手
公共无效设置频率(整数频率){
这个频率=频率;
}
@凌驾
公共整数比较(节点o){
如果(getLetter()==o.letter)
{
o、 countIncrementer();
返回0;
}
else if(getLetter()>o.getLetter())
{
返回1;
}
其他的
{
返回-1;
}
}
}
当我运行这个程序时,无论我加上什么,第一个都会给出一个2的计数

a-->1 b-->2

但我期待着

a-->1 b-->1


如果你能指出问题所在,这将非常有帮助。从我的o.countIncrementer()中可以看出问题所在在我的compareTo方法中。我对java是新手。

代码假设
树集
仅在集合中已经存在一个元素的情况下,才会对一个相等的元素调用比较器,如果它进行这样的比较,它只会执行一次。然而,这不是
树集
的实现方式。Looking在for
TreeSet
中,无法保证将以何种频率进行比较。由于这不是API的文档部分,因此
TreeSet
的作者可以自由地以任何合理的方式实现此功能,只要它符合文档化的API。事实上,他们也是lowed可更改它在不同版本(如Java 6和Java 7)之间或不同实现(如Oracle和IBM)之间的实现方式

简而言之,如果文档不能保证某个行为,那么代码就不应该依赖该行为

为了深入了解您所看到的特定行为,将添加到
树集
(在您使用的Java版本中)的第一个元素与自身进行比较。虽然这可能令人惊讶,但API并没有禁止它。这可能是有原因的,也可能不是有原因的(我相信在Java 7中添加该检查是为了在
null
作为
TreeSet
的第一个元素添加到不允许每个为空的
TreeSet
时强制抛出
NullPointerException
)。但是,最后,检查的原因对API用户来说应该无关紧要,因为它在API中并不被禁止

publicstaticvoidmain(字符串[]args){
System.out.printf(“Java供应商和版本:%s%s\n”,System.getProperty(“Java.vendor”),Runtime.version());
TreeSet set=新的TreeSet(新的LoggingComparator());
集合。添加('a');
}

私有静态类LoggingComparatorWelcome to Stack Overflow。您目前已经发布了超过125行的代码。您提供了一个完整的示例非常好,但是如果您可以将其简化为一个最小的示例,该示例只包含重现该问题所需的代码,则会更好……否则,您会要求人们仔细查看很多计算相关的代码。
compareTo()
应该没有副作用。我甚至不明白你为什么那样构建它。@Milgo你能解释一下
compareTo()吗
应该没有副作用在
compareTo
方法中,您正在增加比较节点的频率。这是该方法不应该有的副作用,因为
TreeSet
使用此方法对其项进行排序。@AyushRanjan与
Set
不同的数据结构o跟踪计数是最简单的解决方案。对于
Map
(或
Map