如何将特定的HashMap条目移动到Last position?
例如,我有像这样的HashMap值:
HashMap<String,Integer> map = new HashMap<String,Integer>();
map= {Not-Specified 1, test 2, testtest 3};
“未指定”可能处于任何位置。它可能首先出现在地图的中间。但我想把“未指定”移到最后一个位置。
我该怎么做?提前谢谢。
答案 0 :(得分:141)
用一句话回答你的问题:
默认情况下,地图没有最后一个条目,这不是合同的一部分。
并注意:对接口进行编码是一种好习惯,而不是实现类(参见Effective Java by Joshua Bloch,第8章,第52项:通过接口引用对象)。< / p>
所以你的声明应该是:
Map<String,Integer> map = new HashMap<String,Integer>();
(所有地图共享一个共同的合同,因此客户不需要知道它是什么类型的地图,除非他指定一个具有扩展合同的子接口)。
有一个子接口SortedMap使用基于顺序的查找方法扩展了地图界面,它有一个子接口NavigableMap,可以进一步扩展它。此接口的标准实现TreeMap允许您通过自然排序(如果它们实现Comparable接口)或由提供的Comparator对条目进行排序。
您可以通过lastEntry方法访问最后一个条目:
NavigableMap<String,Integer> map = new TreeMap<String, Integer>();
// add some entries
Entry<String, Integer> lastEntry = map.lastEntry();
还有LinkedHashMap的特殊情况,HashMap实现存储了键的插入顺序。但是,没有用于备份此功能的接口,也没有直接访问最后一个密钥的方法。你只能通过技巧来实现,比如在中间使用List:
Map<String,String> map = new LinkedHashMap<String, Integer>();
// add some entries
List<Entry<String,Integer>> entryList =
new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Entry<String, Integer> lastEntry =
entryList.get(entryList.size()-1);
由于您不控制插入顺序,您应该使用NavigableMap接口,即您将编写一个最后定位Not-Specified
条目的比较器。
以下是一个例子:
final NavigableMap<String,Integer> map =
new TreeMap<String, Integer>(new Comparator<String>() {
public int compare(final String o1, final String o2) {
int result;
if("Not-Specified".equals(o1)) {
result=1;
} else if("Not-Specified".equals(o2)) {
result=-1;
} else {
result =o1.compareTo(o2);
}
return result;
}
});
map.put("test", Integer.valueOf(2));
map.put("Not-Specified", Integer.valueOf(1));
map.put("testtest", Integer.valueOf(3));
final Entry<String, Integer> lastEntry = map.lastEntry();
System.out.println("Last key: "+lastEntry.getKey()
+ ", last value: "+lastEntry.getValue());
输出:
最后一个键:未指定,最后一个值:1
如果您必须依赖HashMaps,仍然有一个解决方案,使用a)上述比较器的修改版本,b)用Map List初始化的entrySet和c){{ 3}}辅助方法:
final Map<String, Integer> map = new HashMap<String, Integer>();
map.put("test", Integer.valueOf(2));
map.put("Not-Specified", Integer.valueOf(1));
map.put("testtest", Integer.valueOf(3));
final List<Entry<String, Integer>> entries =
new ArrayList<Entry<String, Integer>>(map.entrySet());
Collections.sort(entries, new Comparator<Entry<String, Integer>>(){
public int compareKeys(final String o1, final String o2){
int result;
if("Not-Specified".equals(o1)){
result = 1;
} else if("Not-Specified".equals(o2)){
result = -1;
} else{
result = o1.compareTo(o2);
}
return result;
}
@Override
public int compare(final Entry<String, Integer> o1,
final Entry<String, Integer> o2){
return this.compareKeys(o1.getKey(), o2.getKey());
}
});
final Entry<String, Integer> lastEntry =
entries.get(entries.size() - 1);
System.out.println("Last key: " + lastEntry.getKey() + ", last value: "
+ lastEntry.getValue());
}
输出:
最后一个键:未指定,最后一个值:1
答案 1 :(得分:17)
HashMap没有“最后位置”,因为它没有排序。
您可以使用实施Map
的其他java.util.SortedMap
,最常用的是TreeMap
。
答案 2 :(得分:5)
SortedMap
是逻辑/最佳选择,但另一种选择是使用LinkedHashMap
维护两种订单模式,最近添加的最后一种,最近访问的最后一种。有关详细信息,请参阅Javadocs。
答案 3 :(得分:1)
move对于hashmap没有意义,因为它是一个带有hashcode的字典,用于基于key的bucketing,然后是一个用于通过equals解析的冲突哈希码的链表。 对已排序的地图使用TreeMap,然后传入自定义比较器。
答案 4 :(得分:0)
当使用数字作为键时,我想你也可以试试这个:
Map<Long, String> map = new HashMap<>();
map.put(4L, "The First");
map.put(6L, "The Second");
map.put(11L, "The Last");
long lastKey = 0;
//you entered Map<Long, String> entry
for (Map.Entry<Long, String> entry : map.entrySet()) {
lastKey = entry.getKey();
}
System.out.println(lastKey); // 11
答案 5 :(得分:0)
在这种情况下,最后使用的密钥通常是已知的,因此可以用于访问最后一个值(插入一个):
class PostIndexData {
String _office_name;
Boolean _isGov;
public PostIndexData(String name, Boolean gov) {
_office_name = name;
_isGov = gov;
}
}
//-----------------------
class KgpData {
String _postIndex;
PostIndexData _postIndexData;
public KgpData(String postIndex, PostIndexData postIndexData) {
_postIndex = postIndex;
_postIndexData = postIndexData;;
}
}
public class Office2ASMPro {
private HashMap<String,PostIndexData> _postIndexMap = new HashMap<>();
private HashMap<String,KgpData> _kgpMap = new HashMap<>();
...
private void addOffice(String kgp, String postIndex, String officeName, Boolean gov) {
if (_postIndexMap.get(postIndex) == null) {
_postIndexMap.put(postIndex, new PostIndexData(officeName, gov));
}
_kgpMap.put( kgp, new KgpData(postIndex, _postIndexMap.get(postIndex)) );
}
答案 6 :(得分:0)
Find missing all elements from array
int[] array = {3,5,7,8,2,1,32,5,7,9,30,5};
TreeMap<Integer, Integer> map = new TreeMap<>();
for(int i=0;i<array.length;i++) {
map.put(array[i], 1);
}
int maxSize = map.lastKey();
for(int j=0;j<maxSize;j++) {
if(null == map.get(j))
System.out.println("Missing `enter code here`No:"+j);
}