【发布时间】:2017-06-10 10:15:04
【问题描述】:
我正在做一个小项目,但遇到了一个问题(?)我无法解释。这是我的代码:
====主要=====
Beacon b1 = new Beacon("192.168.0.12", 72.0);
Beacon b4 = new Beacon("192.168.0.13", 72.0);
Beacon b2 = new Beacon("192.168.0.24", 84.0);
Beacon b3 = new Beacon("192.168.0.5", 64.0);
ArrayList<Beacon> alBeacons = new ArrayList();
alBeacons.add(b4);
alBeacons.add(b2);
alBeacons.add(b1);
alBeacons.add(b3);
Room room = new Room("Testroom", alBeacons);
====信标====
public class Beacon {
String sIP;
private int ID = 0;
private Double RSSi;
public Beacon(String sIP, double RSSi){
this.sIP = sIP;
this.RSSi = RSSi;
setID();
}
private void setID(){
String sTemp[] = sIP.split("\\.");
this.ID = Integer.parseInt(sTemp[sTemp.length-1]);
}
public String getsID(){
return String.valueOf(ID);
}
public int getID(){
return ID;
}
}
====房间====
public Room(String sName, ArrayList<Beacon> alBeacons){
System.out.println("Unsorted: " + alBeacons.hashCode());
for(Beacon b: alBeacons){
System.out.println(b.getID());
}
alBeacons.sort(new Comparator<Beacon>() {
@Override
public int compare(Beacon o1, Beacon o2) {
return o1.getID() - o2.getID();
}
});
System.out.println("Sorted: " + alBeacons.hashCode());
for(Beacon b: alBeacons){
System.out.println(b.getID());
}
}
现在我遇到的问题是,在未排序状态下,无论 Beacons 是如何插入到 ArrayList 中的,我总是得到相同的 HashCode(),1498918675。一旦对它们进行排序,我就会得到不同的 HashCode ,这是有道理的。但现在的问题是,根据 ArrayList 的排序方式,排序后我得到了不同的 HashCode。这是 .sort() 所固有的,还是我对实数排序的修复破坏了它?
编辑:以下是一些输出示例:
Unsorted: 1498918675
13
24
12
5
Sorted: 341854239
5
12
13
24
Unsorted: 1498918675
24
5
12
13
Sorted: 638040239
5
12
13
24
Unsorted: 1498918675
12
5
24
13
Sorted: 1060992495
5
12
13
24
【问题讨论】:
-
您能否说明您对信标列表进行排序的目标是什么?
-
你在说什么hashCode?列表的hashCode?为什么你会惊讶它的 hashCode 会根据包含的内容而变化?你为什么在乎?
-
你能告诉我们整个 Beacon 代码吗?
-
@TimBiegeleisen 我正在研究室内定位引擎,为了速度,我给每个房间一个哈希值。当我需要查看房间中是否有人时,我可以比较 hashCode。
-
您不能单独使用 hashCode 作为列表中内容的指示。哈希码不是唯一的,并且不保证在正确实施时具有与
equals()兼容之外的任何特定属性。
标签: java sorting arraylist integer hashcode