Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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 LinkedHashMap搜索_Java_Linkedhashmap - Fatal编程技术网

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();
我要问两个问题:

  • 如何找到具有特定值且名称为“square”的成员
  • 我怎样才能得到数量最少的所有会员
  • 谢谢

    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 );
        }
    }