嗨我想在HashMap中保存一个对象,如果它不存在,那么如果它是exsit我想用新数据控制它的值。如果数据发生变化而不是我想做的......其他。但每当我试图比较新数据和哈希值时,我发现它们每次都是相同的。我该如何处理这个问题。有代码:
BluetoothLeDevice deviceLe;
private Map<String, byte[]> mMacMap;
byte [] integer0 =new byte[4];
byte[] tempInteger0=new byte[4];
public void addSensor(String macId, BluetoothLeDevice deviceLe) {
byte [] addSensorrecord=deviceLe.getScanRecord();
int j=0;
for(int i=15;i<19;i++)
{
integer0 [j]=addSensorrecord[i];
j++;
}
if (mMacMap.containsKey(macId)) {
tempInteger0 = mMacMap.get(macId);
if(!integer0 .equals(tempInteger0))
{
mMacMap.remove(macId);
mMacMap.put(macId, integer0 );
new SendBLEData().execute(deviceLe);
}
} else {
final byte [] LocalInteger0=new byte[4];
int t=0;
for(int i=15;i<19;i++)
{
LocalInteger0[t]=addSensorrecord[i];
t++;
}
mMacMap.put(macId, LocalInteger0);
new SendBLEData().execute(deviceLe);
}
}
答案 0 :(得分:2)
我猜,你的问题就在这里:
!Integer0.equals(tempInteger0))
我想你要比较两个数组;你会惊讶地发现它们总是不同......
你的问题是:数组上的equals()没有对数组内容进行比较。换句话说:这个对equals()的调用只给出&#34; true&#34;如果您要比较的数组是同一个,例如:
int a[] = { 1 };
int b[] = a;
int c[] = { 1 };
下面:
a.equals(b) --> true
但
a.equals(c) --> false
在比较数组内容时,您应该使用ArrayList。因为两个ArrayList对象相等,因为它们包含完全相同的相等元素。
你会看到:你在数组上使用等于你的代码做出决定。所以,你要么改为ArrayLists;或者使用Arrays.equals()作为用户hamsty建议。
答案 1 :(得分:1)
只是对已发布的答案进行了一些补充。
下面的删除不是必需的,简单的put将替换旧值
mMacMap.remove(macId);
mMacMap.put(macId, integer0 );
来自javadoc
如果地图以前包含该键的映射,则为旧值 由指定的值替换。 (据说地图m包含一个 当且仅当m.containsKey(k)将返回时,映射键k 真。)
您是否考虑过将字节15-19转换为字符串并将其添加到地图键上?这将消除数组比较并使查找更快。
答案 2 :(得分:0)
!Integer0.equals(tempInteger0))
是你的问题。
用它来比较数组的内容:
Arrays.equals(Integer0, tempInteger0)
答案 3 :(得分:0)
问题是以下一系列事件:
macId
不在mMacMap
,将new byte[4];
插入地图macId
中的mMacMap
,由于其他答案提到的数组比较问题,上一步创建的数组永远不会匹配integer0
,请替换地图中的macId
引用integer0
macId
位于mMacMap
,因为数组是integer0
的引用,它将始终进行正比较,内容将不再更新。基本上由这两个问题引起:
Array#equals
行为不直观,请使用静态方法Arrays.equals