Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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)的相同顺序解析映射(foreach)_Java_Map_Sorting_Foreach - Fatal编程技术网

如何按照创建映射(JAVA)的相同顺序解析映射(foreach)

如何按照创建映射(JAVA)的相同顺序解析映射(foreach),java,map,sorting,foreach,Java,Map,Sorting,Foreach,因此,我有一个按照我想要的顺序创建(插入数据)的地图。 解析映射时,foreach中返回的第一个键不是我插入的第一个键。 有没有办法做到这一点 另外,对我的地图进行排序有点棘手,因为它必须按值和值中的特定字段进行排序。 Ty检查是否有具有可预测迭代顺序的映射实现。如果你实际上没有使用键来查找,你也可以考虑只使用列表。 如果你可以通过值属性预先对你的项进行排序,那么你可以使用 LinkedListHashMap < /C> >,因为这保留了你指定的顺序。但是,这似乎有点脆弱,如果以后需要向地图添加

因此,我有一个按照我想要的顺序创建(插入数据)的地图。 解析映射时,foreach中返回的第一个键不是我插入的第一个键。 有没有办法做到这一点

另外,对我的地图进行排序有点棘手,因为它必须按值和值中的特定字段进行排序。
Ty

检查是否有具有可预测迭代顺序的映射实现。如果你实际上没有使用键来查找,你也可以考虑只使用列表。

如果你可以通过值属性预先对你的项进行排序,那么你可以使用<代码> LinkedListHashMap < /C> >,因为这保留了你指定的顺序。但是,这似乎有点脆弱,如果以后需要向地图添加更多项目,则不适合

另一种方法是将值存储在一个列表中,根据需要进行排序,然后使用二进制搜索来检索项并找到新项的插入点

您甚至可以将所有这些内容包装起来,并将其放在
Map
界面后面

Collections类提供。这里有一个提纲:

  • 将值类放入列表中,
    列出值
  • 实现一个
    Comparable
    类,该类使用要对值进行排序的属性来比较值
  • 使用
    Comparator
    对列表进行排序
  • 现在列表已排序,您可以使用
    Collections.binarySearch(values、aValue、Comparator)
    查找实际值的索引。请注意,aValue不是一个实际值-它是一个属性设置为提供键的值,但其其余部分是非斜体的。aValue仅用于保存排序键
编码

List<Value> values = new ArrayList<Values>();
// .. add values
values.add(new Value(key, data1, data2, etc..));
Comparator<Value> compValue = new Comparator<Value>() {
  public int compare(Value v1, Value v2) {
     return v1.getKey()>v2.getKey();
  }
}

Collections.sort(values, compValue);
// now we can search on key
int index = Collections.binarySearch(values, new Value(keyTofind), valueComp);
Value foundValue = null;  // value with the key may not be in the list
if (index>=0) 
   foundValue = values.get(index);

// we can also update the list
Value newValue = new Value(key, data, data2, etc...);
int insert = Collections.binarySearch(values, newValue, valueComp);
// insert will be negative
values.add((-insert)-1, newValue);
List values=new ArrayList();
// .. 增加价值
添加(新值(键、数据1、数据2等));
比较器compValue=新比较器(){
公共整数比较(值v1,值v2){
返回v1.getKey()>v2.getKey();
}
}
Collections.sort(值,compValue);
//现在我们可以在键盘上搜索
int index=Collections.binarySearch(值、新值(keyTofind)、valueComp);
Value foundValue=null;//带有键的值可能不在列表中
如果(索引>=0)
foundValue=values.get(索引);
//我们还可以更新列表
Value newValue=新值(键、数据、数据2等);
int insert=Collections.binarySearch(value、newValue、valueComp);
//插入将是负数
添加((-insert)-1,newValue);

编辑:如果您将其包装在地图界面中,例如扩展AbstractMap,它将是可序列化的。

让我们看看。您的要求似乎是:

  • 您有一组键/值对,其中键是唯一的
  • 您希望能够快速查找给定键的值
  • 您希望能够按插入顺序迭代键(或对)
  • 您希望能够按照值类型的某个字段的顺序迭代这些值
  • 没有一个标准的Java集合类可以满足所有这些要求。我不认为Commons collections或Google collections会

    如果您要抛出需求3,那么一个
    树集
    (用一个自定义
    比较器
    实例化)将完成这项工作。如果您要放弃要求4,那么一个
    LinkedHashMap
    就可以完成这项工作

    要满足所有要求,您需要执行以下操作之一:

    • 使用
      LinkedHashMap
      ,当您想根据值以某种顺序进行迭代时,提取映射的
      集合,使用自定义比较器对其进行排序,然后 返回已排序集合的迭代器

    • 同时使用
      LinkedHashMap
      TreeMap
      ,并并行更新这两个

    • LinkedHashMap
      TreeMap
      创建自定义fascade类。这需要在调用
      put
      remove
      等时使两个数据结构保持最新,并提供获取排序值的额外方法


    Ty非常多,但现在这引发了另一个问题。我不能想要一个linkedhashmap,我对hashmap没有问题。所以我将再次发布另一个问题g.Ty