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在forTreeSet
中,无法保证将以何种频率进行比较。由于这不是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