特定のHashMapエントリを最後の位置に移動する方法は?
たとえば、次のようなHashMap値があります。
HashMap<String,Integer> map = new HashMap<String,Integer>();
map= {Not-Specified 1, test 2, testtest 3};
「指定なし」は任意の位置に配置できます。最初に来る場合もあれば、マップの中央に来る場合もあります。しかし、「指定なし」を最後の位置に移動したいです。
どうやってやるの?前もって感謝します。
1つの文で質問に答えるには:
デフォルトでは、マップには最後のエントリがなく、それらは契約の一部ではありません。
補足説明:実装クラスではなく、インターフェイスに対してコーディングすることをお勧めします( Effective Java by Joshua Bloch 、Chapter 8、Item 52:オブジェクトをインターフェイスで参照する)。
したがって、宣言は次のようになります。
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実装です。ただし、この機能をバックアップするインターフェイスはなく、最後のキーに直接アクセスする方法もありません。間にリストを使用するなどのトリックを介してのみ実行できます。
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) List Mapの entrySet およびc) Collections.sortを使用した解決策がまだあります() ヘルパーメソッド:
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
HashMapには"the last position"はありません。ソートされていないためです。
Java.util.SortedMap
を実装する他のMap
を使用できますが、最も人気のあるものはTreeMap
です。
SortedMap
は論理的/最適な選択ですが、別のオプションは、2つの順序モードを維持するLinkedHashMap
を使用することです。詳細については、Javadocsを参照してください。
moveはハッシュマップには意味がありません。これは、キーに基づいたバケット化のためのハッシュコードと、equalsによって解決されたハッシュコードを衝突させるためのリンクリストを備えた辞書だからです。ソートされたマップにTreeMapを使用し、カスタムコンパレーターを渡します。
このようなシナリオでは、最後に使用されたキーは通常知られているので、最後の値にアクセスするために使用できます(1つと一緒に挿入されます):
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)) );
}
キーとして数字を使用する場合、これを試すこともできます。
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
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);
}