web-dev-qa-db-ja.com

マップの最後のエントリにアクセスする

特定のHashMapエントリを最後の位置に移動する方法は?

たとえば、次のようなHashMap値があります。

HashMap<String,Integer> map = new HashMap<String,Integer>();

map= {Not-Specified 1, test 2, testtest 3};

「指定なし」は任意の位置に配置できます。最初に来る場合もあれば、マップの中央に来る場合もあります。しかし、「指定なし」を最後の位置に移動したいです。

どうやってやるの?前もって感謝します。

52
Gnaniyar Zubair

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

HashMapを使用したソリューション:

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

145

HashMapには"the last position"はありません。ソートされていないためです。

Java.util.SortedMapを実装する他のMapを使用できますが、最も人気のあるものはTreeMapです。

SortedMapは論理的/最適な選択ですが、別のオプションは、2つの順序モードを維持するLinkedHashMapを使用することです。詳細については、Javadocsを参照してください。

5
Peter Lawrey

moveはハッシュマップには意味がありません。これは、キーに基づいたバケット化のためのハッシュコードと、equalsによって解決されたハッシュコードを衝突させるためのリンクリストを備えた辞書だからです。ソートされたマップにTreeMapを使用し、カスタムコンパレーターを渡します。

1
anand

このようなシナリオでは、最後に使用されたキーは通常知られているので、最後の値にアクセスするために使用できます(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)) );
        }
0
Mad Calm

キーとして数字を使用する場合、これを試すこともできます。

        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
0
Yoshua Nahar
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);
        }
0
Muruganandam C