Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
地图上的Java观察者_Java_Hashmap_Observable_Sortedmap - Fatal编程技术网

地图上的Java观察者

地图上的Java观察者,java,hashmap,observable,sortedmap,Java,Hashmap,Observable,Sortedmap,我正在做一些事情,我需要一个观察者或监听器,当映射的入口集发生变化时,它会做出反应。 我真的不知道为什么我的观察者没有反应 首先,我有一个StorageModel,它应该是可观察的对象: public class StorageModel extends Observable{ public SortedMap<String, Integer> coMap; public SortedMap<String, Integer>

我正在做一些事情,我需要一个观察者或监听器,当映射的入口集发生变化时,它会做出反应。 我真的不知道为什么我的观察者没有反应

首先,我有一个StorageModel,它应该是可观察的对象:

        public class StorageModel extends Observable{

        public SortedMap<String, Integer> coMap;
        public SortedMap<String, Integer> co2Map;

        private String id;

        public StorageModel(String id) {
            this.id = id;
            coMap = new TreeMap<>(Collections.reverseOrder());
            co2Map = new TreeMap<>(Collections.reverseOrder());

            Observer storageObserver = new Classificator(coMap, co2Map);

            addObserver(storageObserver);
        }

    public void writeToCoMap(SortedMap<String, Integer> map, String str, int val){
        map.put(str, val);
        listenToChangesInCo(map);
    }

    public void writeToCo2Map(SortedMap<String, Integer> map, String str, int val){
        map.put(str, val);
        listenToChangesInCo2(map);
    }

    public void listenToChangesInCo(SortedMap<String, Integer> map){
        setChanged();
        this.coMap = map;
        notifyObservers(coMap.entrySet());
    }

    public void listenToChangesInCo2(SortedMap<String, Integer> map){
        setChanged();
        this.co2Map = map;
        notifyObservers(co2Map.entrySet());
    }

}


public class Classificator implements ConstantFields, Runnable, Observer{

static Set<MeasurementModel> classifiedWaspmotes = new HashSet<>();
static Set<StorageModel> waspmotes = new HashSet<>();
private static SortedMap<String, Integer> coMap = new TreeMap<>();
private static SortedMap<String, Integer> co2Map = new TreeMap<>();

private static StorageModel observerableStorageModel;

public Classificator(SortedMap<String, Integer> coMap, SortedMap<String, Integer> co2Map){
    this.coMap = coMap;
    this.co2Map = co2Map;
}

@Override
public void update(Observable observable, Object o) {
    observerableStorageModel = (StorageModel) observable;
    System.out.println("reacting to changes");
}
}
公共类存储模型扩展了可观察{
公共分类地图;
公众分类的DMAP co2Map;
私有字符串id;
公共存储模型(字符串id){
this.id=id;
coMap=newtreemap(Collections.reverseOrder());
co2Map=newtreemap(Collections.reverseOrder());
Observer storageObserver=新的分类器(coMap、co2Map);
addObserver(storageObserver);
}
public void writeToCoMap(SortedMap映射、字符串str、int val){
地图放置(str,val);
listenToChangesInCo(map);
}
public void writeToCo2Map(SortedMap映射、字符串str、int val){
地图放置(str,val);
ListentChangesCO2(map);
}
公共无效列表更改SINCO(分类地图){
setChanged();
this.coMap=map;
notifyObservers(coMap.entrySet());
}
公开作废清单变更CO2(分类地图){
setChanged();
this.co2Map=map;
notifyObserver(co2Map.entrySet());
}
}
公共类Classificator实现ConstantFields、Runnable和Observer{
static Set classifiedWaspmotes=new HashSet();
静态集waspmotes=newhashset();
private static SortedMap coMap=new TreeMap();
私有静态SortedMap co2Map=新树映射();
私有静态存储模型observerstoragemodel;
公共分级器(分类地图coMap、分类地图co2Map){
this.coMap=coMap;
这个.co2Map=co2Map;
}
@凌驾
公共无效更新(可观察,对象o){
ObservableStorageModel=(StorageModel)可观测;
System.out.println(“对变化作出反应”);
}
}
在另一个功能中,处理来自无线模块的传入数据 我想把已经处理过的数据写入现有的地图,这就是观察者应该做出反应的地方

public void truncateMessage(String msg, String nodeID, SortedMap<String, Integer> coMap, SortedMap<String, Integer> co2map) throws InterruptedException {
    StorageModel mod = new StorageModel();
    mod.setId(nodeID);

    String message = msg;
    List<Integer> coValues = new ArrayList<>();
    List<Integer> co2Values = new ArrayList<>();

    String idStr = message.substring(0, 3);
    String digits = "";

    if(idStr.equals("CO_")){
        System.out.println("co found");
        System.out.println(message);
        message = cleanseMessage(message);
        System.out.println(message);

        addValuesToList(coValues, message);
        System.out.println("values found in list");
        System.out.println(coValues);

        for(int i: coValues){
            //coMap.put(sdf.format(new Date()), i);
            mod.writeToCoMap(coMap, sdf.format(new Date()), i);
            Thread.sleep(100);
        }
}
public void truncateMessage(字符串msg、字符串nodeID、SortedMap coMap、SortedMap co2map)引发中断异常{
StorageModel mod=新的StorageModel();
mod.setId(nodeID);
字符串消息=msg;
List coValues=new ArrayList();
List co2Values=new ArrayList();
字符串idStr=message.substring(0,3);
字符串数字=”;
if(idStr.equals(“CO”)){
System.out.println(“共同发现”);
System.out.println(消息);
消息=消息(消息);
System.out.println(消息);
addValuesToList(共值、消息);
System.out.println(“列表中找到的值”);
系统输出打印项次(共值);
for(int i:共值){
//coMap.put(sdf.format(new Date()),i);
mod.writeToCoMap(coMap,sdf.format(new Date()),i);
睡眠(100);
}
}
我非常感谢你的帮助


干杯

…问题是什么?告诉我们您希望看到什么输出,以及您实际看到什么输出。问题是,观察者没有对更改做出反应,因此没有输出,当发生更改时,观察者应该使用数据做些事情,在您调用
mod.writeToCoMap(…)时,在断点处打勾
,在调试器中运行它,进入
writeToCoMap()
,进入
ListentChangesInCo()
,进入
NotifyObservators()
并查看
Observable
对它做了什么。因此,coMap的大小会发生变化,但它不会进入NotifyObservators())。是否可能它没有像我希望它在StorageModel构造函数中那样添加观察者?当我覆盖NotifyObservators()时,它会输出我的自定义消息,但无法告诉观察者为什么没有对此作出反应