Java Hashtable问题

3

如果从其自己的类中调用,我的代码返回预期的entrySet()。但是,如果我通过Main中的getter方法调用它,它将返回一个空表格。为什么?

class Results
{
    Hashtable<String, Double> langScores ;

    public Results()
    {
        langScores = new Hashtable<String, Double>() ;
    }

    public void addScores(double pL1, double pL2, double pL3)
    {
        langScores.put("English", pL1 ) ;
        langScores.put("French", pL2 ) ;
        langScores.put("German", pL3 ) ;
        System.out.println(langScores.entrySet()) ;
    }

    public Set<Map.Entry<String, Double>> getWinner()
    {
        return langScores.entrySet() ;
    }
}

主要内容:

class LanguageIdentifier 
{
    public static void main(String[] args) 
    {
        Results winner = new Results() ;

        AnalyseText analyse = new AnalyseText() ; //addScores called from this class

        analyse.analyseText() ;
        System.out.println(winner.getWinner()) ;
    }
}

输出

[German=0.0040, French=0.0030, English=0.02] // print statement within Results class works

[] // print statement within Main class prints empty table !?

你在主要代码片段中的哪里调用addScores()函数? - sjr
addScores是从AnalyseText类中调用的,只要我得到一个填充好的表格,它就能正常工作。另外请注意,Result类中的打印语句是在添加语句之后显示它们工作的。 - user425727
1
但是你没有将结果传递给AnalyseText类。你正在调用addScores()方法,但是这个对象与你调用getWinner()方法的对象不同。 - sjr
是的,我现在意识到了。必须想办法使哈希表对象独立,如果有这样的东西的话。 - user425727
2个回答

2

在你的主函数中,没有将任何分数添加到winner(使用addScores),所以它仍然是空的。

添加这行代码 winner.addScores(1, 2, 3);解决了我的问题。

正如sjr提到的,并根据您的编辑,您没有在创建时将Results对象的引用传递给analyse对象。将AnalyseText构造函数更改为接收Results对象作为参数,并将TextAnalyser的私有Result引用设置为该对象:

Results winner;
public TextAnalyser(Results winner)
{
    this.winner = winner;
}

谢谢。我没有考虑面向对象的术语,认为Hashtable langScores将是独立于对象的。 - user425727

0

这是因为main方法中的Results实例与AnalyseText对象中的实例不同。

这是面向对象编程的基础。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接