我的申请与股票市场有关。我有一个不断更新一个称为Price的对象的提要。 Price具有存储安全代码(String)和价格(Double)的HashMap。每次有新价格出现时,此对象就会更新。

该应用程序应该扫描价格以获取较大波动。我有一个名为Poller的单独的类,该类每秒轮询Price对象并获取价格快照。快照是如上所述的HashMap。然后,我想将此价格HashMap和pollNumber一起存储在另一个HashMap中,以后可以传递pollNumber并在对应于该pollNumber的时间获取价格。

但是,相反,我将所有先前的价格都覆盖了,并输出类似于以下内容的价格。

0:{MSFT = 17.67,AAPL = 93.85,GOOG = 333.86}
{0 = {MSFT = 17.67,AAPL = 93.85,GOOG = 333.86}}

1:{MSFT = 17.64,AAPL = 93.85,GOOG = 334.02}
{0 = {MSFT = 17.64,AAPL = 93.85,GOOG = 334.02},1 = {MSFT = 17.64,AAPL = 93.85,GOOG = 334.02}}

2:{MSFT = 17.64,AAPL = 93.85,GOOG = 334.08}
{0 = {MSFT = 17.64,AAPL = 93.85,GOOG = 334.08},1 = {MSFT = 17.64,AAPL = 93.85,GOOG = 334.08},
2 = {MSFT = 17.64,AAPL = 93.85,GOOG = 334.08}}

3:{MSFT = 17.65,AAPL = 93.83,GOOG = 334.08}
{0 = {MSFT = 17.65,AAPL = 93.83,GOOG = 334.08},1 = {MSFT = 17.65,AAPL = 93.83,GOOG = 334.08},2 = {MSFT = 17.65,AAPL = 93.83,GOOG = 334.08},3 = {MSFT = 17.65,AAPL = 93.83,GOOG = 334.08}}

4:{MSFT = 17.64,AAPL = 93.83,GOOG = 334.07}
{0 = {MSFT = 17.64,AAPL = 93.83,GOOG = 334.07},1 = {MSFT = 17.64,AAPL = 93.83,GOOG = 334.07},2 = {MSFT = 17.64,AAPL = 93.83,GOOG = 334.07},3 = {MSFT = 17.64,AAPL = 93.83,GOOG = 334.07},4 = {MSFT = 17.64,AAPL = 93.83,GOOG = 334.07}}

如您所见,当我打印应该具有不同价格序列的整个HashMap时,它们都是相同的。

基本上,.put()函数会以某种方式覆盖旧条目。

如果您知道如何解决此问题,以便HashMap(大对象)每次都有一个新的价格系列条目。



public class Poller {

    private final int period=1000;
    private final int delay=1000;

    private static int pollNumber=0;
    private static HashMap<Integer,HashMap<String,Double>>
        polledPrice = new HashMap<Integer, HashMap<String,Double>>();

    public void pollPrice(){

    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
                public void run() {
                //    System.out.println(Price.getPricesMap());
System.out.println(pollNumber+" : "+Price.getPricesMap());
                    polledPrice.put(pollNumber, Price.getPricesMap());
                    System.out.println(polledPrice);
                    pollNumber = pollNumber+1;

                    Time atime = new Time();
                        atime.addToTimeMap(pollNumber);

                }
            }, delay, period);
    }
}

最佳答案

您需要复制HashMap,否则看起来就像您只是一次又一次地存储相同的Map,这当然会被覆盖。使用此行:

polledPrice.put(pollNumber, new HashMap(Price.getPricesMap()));


作为最简单的解决方法。

关于java - 每次我使用.put()时,HashMap都会被覆盖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/576912/

10-10 08:14