地图上的Java观察者
我正在做一些事情,我需要一个观察者或监听器,当映射的入口集发生变化时,它会做出反应。 我真的不知道为什么我的观察者没有反应 首先,我有一个StorageModel,它应该是可观察的对象:地图上的Java观察者,java,hashmap,observable,sortedmap,Java,Hashmap,Observable,Sortedmap,我正在做一些事情,我需要一个观察者或监听器,当映射的入口集发生变化时,它会做出反应。 我真的不知道为什么我的观察者没有反应 首先,我有一个StorageModel,它应该是可观察的对象: public class StorageModel extends Observable{ public SortedMap<String, Integer> coMap; public SortedMap<String, Integer>
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()时,它会输出我的自定义消息,但无法告诉观察者为什么没有对此作出反应