Java LinkedHashMap搜索
我有一节课Java LinkedHashMap搜索,java,linkedhashmap,Java,Linkedhashmap,我有一节课 class polygon { private String name; private int quantity; // default constructor private polygon() { } public String get name() { return name; } public void setname(String name) { this.name = n
class polygon
{
private String name;
private int quantity;
// default constructor
private polygon()
{ }
public String get name() {
return name;
}
public void setname(String name) {
this.name = name;
}
public int getquantity() {
return quantity;
}
public void setquantity(int quantity) {
this.quantity = quantity;
}
}
我还有一张这样的地图:
LinkedHashMap<Integer, polygon> polymap = new LinkedHashMap<Integer, polygon>();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof polygon)) return false;
polygon polygon = (polygon) o;
if (!name.equals(polygon.name)) return false;
return true;
}
LinkedHashMap polymap=new LinkedHashMap();
我要问两个问题:
LinkedHashMap<Integer, polygon> polymap = new LinkedHashMap<Integer, polygon>();
注意:您正在重写类的equals()
方法,因此可能会对您在应用程序的其他位置如何使用它产生一些副作用
我建议您保持一个单独的
PriorityQueue
,以查找最低数量的polygon
。在初始化队列时提供一个自定义的比较器。我们从评论和更新中了解到:Polygon是一个具有成员字符串名称(可能但不一定唯一)和整数数量(无限制)的类。还有一个时间戳,这个整数用作
Map<Integer,Polygon> polymap
现在这是一个顺序搜索,如果条目数量很大,可能需要一些时间。假设名称是唯一的,O(1)访问时间可以通过创建另一个与polymap并行的贴图,将名称字符串映射到多边形对象来实现。(考虑删除的额外工作,但是Map.remove(,.)应该会有所帮助。)
要查找具有最小数量的所有多边形,请确定最小数量,同时保留一组具有该最小数量的多边形:
int min = Integer.MAX_VALUE;
Set<Polygon> polyset = new HashSet<>();
for( Polygon polygon: polymap.values() ){
int qtty = polygon.getQuantity();
if( qtty < min ){
min = qtty;
polyset.clear();
polyset.add( polygon );
} else if( qtty == min ){
polyset.add( polygon );
}
}
int min=Integer.MAX\u值;
Set polyset=new HashSet();
对于(多边形:polymap.values()){
int qtty=polygon.getQuantity();
如果(数量<分钟){
min=qtty;
polyset.clear();
添加(多边形);
}否则如果(qtty==min){
添加(多边形);
}
}
同样,顺序搜索,但这里第二个映射需要一个多重映射,即映射
您认为这将如何工作?我建议重复<代码>地图::值< /C> >过滤你所寻找的。因为我对C++更熟悉,我知道使用Boo::BoD是可能的,但是我是java新手。我想知道是否有比迭代值更好的方法。您应该与地图2中的每个名称进行比较。根据数量对地图进行降序排序@Satya如何“对地图进行排序”?请解释一下,我不知道这里的人为什么给我-1。我问了一个问题,如果你有更好的主意,就帮帮我。给我-1虚空既不能帮助我,也不能说明你能回答这个问题。对一个类进行临时更改,以“简化”一项任务,同时冒着在其他地方破坏程序的风险(正如你正确指出的那样),这很难算是“最佳实践”。考虑到你关于#2的回答:为什么不对#1做同样的事情呢?@laune维护多个数据结构会增加开销,而且容易出错。我想如果他重新考虑第一个地图数据结构,我会很好。我只是试着用提供的信息来解决问题。@YuongHobbit谢谢你们的回答,你们对地图结构有更好的想法吗?我的地图上有很多会员。我知道Booo::无序的映射是一个很好的开始,如果是用C++编写的,但是在java中我没有太多的经验。@ RunEe有可能改变多边形的结构吗?数据结构也会有相同的警告,即覆盖equals方法以实现#1。非常感谢您的回答,如果我们假设多边形在polymap中的名称是唯一的,我如何改进搜索?正如我所写的:您可以创建另一个地图,而不是或除了polymap之外,在polymap中名称是关键。但我不能发明代码——创造多边形地图——这不在你的问题中或者,如果polymap标识可以基于name字段(我不建议您不知道该程序中还有什么),您可以使用equals和hashCode(!)修改polymap-请参阅YoungHobbit的答案。
int min = Integer.MAX_VALUE;
Set<Polygon> polyset = new HashSet<>();
for( Polygon polygon: polymap.values() ){
int qtty = polygon.getQuantity();
if( qtty < min ){
min = qtty;
polyset.clear();
polyset.add( polygon );
} else if( qtty == min ){
polyset.add( polygon );
}
}