如何按照创建映射(JAVA)的相同顺序解析映射(foreach)
因此,我有一个按照我想要的顺序创建(插入数据)的地图。 解析映射时,foreach中返回的第一个键不是我插入的第一个键。 有没有办法做到这一点 另外,对我的地图进行排序有点棘手,因为它必须按值和值中的特定字段进行排序。如何按照创建映射(JAVA)的相同顺序解析映射(foreach),java,map,sorting,foreach,Java,Map,Sorting,Foreach,因此,我有一个按照我想要的顺序创建(插入数据)的地图。 解析映射时,foreach中返回的第一个键不是我插入的第一个键。 有没有办法做到这一点 另外,对我的地图进行排序有点棘手,因为它必须按值和值中的特定字段进行排序。 Ty检查是否有具有可预测迭代顺序的映射实现。如果你实际上没有使用键来查找,你也可以考虑只使用列表。 如果你可以通过值属性预先对你的项进行排序,那么你可以使用 LinkedListHashMap < /C> >,因为这保留了你指定的顺序。但是,这似乎有点脆弱,如果以后需要向地图添加
Ty检查是否有具有可预测迭代顺序的映射实现。如果你实际上没有使用键来查找,你也可以考虑只使用列表。 如果你可以通过值属性预先对你的项进行排序,那么你可以使用<代码> LinkedListHashMap < /C> >,因为这保留了你指定的顺序。但是,这似乎有点脆弱,如果以后需要向地图添加更多项目,则不适合 另一种方法是将值存储在一个列表中,根据需要进行排序,然后使用二进制搜索来检索项并找到新项的插入点 您甚至可以将所有这些内容包装起来,并将其放在
Map
界面后面
Collections类提供。这里有一个提纲:
- 将值类放入列表中,
李>列出值
- 实现一个
类,该类使用要对值进行排序的属性来比较值李>Comparable
- 使用
对列表进行排序Comparator
- 现在列表已排序,您可以使用
查找实际值的索引。请注意,aValue不是一个实际值-它是一个属性设置为提供键的值,但其其余部分是非斜体的。aValue仅用于保存排序键Collections.binarySearch(values、aValue、Comparator)
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,它将是可序列化的。让我们看看。您的要求似乎是:
树集
(用一个自定义比较器
实例化)将完成这项工作。如果您要放弃要求4,那么一个LinkedHashMap
就可以完成这项工作
要满足所有要求,您需要执行以下操作之一:
- 使用
,当您想根据值以某种顺序进行迭代时,提取映射的LinkedHashMap
集合,使用自定义比较器对其进行排序,然后 返回已排序集合的迭代器值
- 同时使用
和LinkedHashMap
,并并行更新这两个TreeMap
- 为
和LinkedHashMap
创建自定义fascade类。这需要在调用TreeMap
、put
等时使两个数据结构保持最新,并提供获取排序值的额外方法remove