从HashMap中删除位置

时间:2015-05-13 14:35:36

标签: java hashmap

我正在做类似音乐播放器的事情。我正在HashMap上构建播放列表,我在删除特定的setlist时遇到问题(案例5)。它工作,但当我删除列表中间的位置情况1(显示所有播放列表)不再有效,因为我有空的空间(1,2,3,删除,5,6 ......)。现在如何在删除一个减少指数后将这些位置设为1?看起来像x--并不能解决我的问题。我希望你理解我的问题,这里是代码,如果你需要我翻译任何东西到英语只是问。谢谢你的帮助!

package PLAYLIST2;

import java.util.HashMap;
import java.util.Scanner;

public class Odtwarzacz {

    // String lista;

    // Odtwarzacz(Playlist) {
    // lista = b;
    // }

    public static void main(String[] args) {
        int nr;
        int koniec = 0;
        String nazwa11;
        int x = 0;
        HashMap<Integer, Playlist> Playlista = new HashMap<Integer, Playlist>();
        Playlista.put(x, new Playlist("Rock"));
        x++;
        Playlista.get(0).dodajUtwor("Stockholm Syndrome", "Muse", 2004);
        Playlista.get(0).dodajUtwor("Absolution", "Muse", 2004);
        Playlista.put(x, new Playlist("Pop"));
        x++;
        Scanner odczyt = new Scanner(System.in);
        // TODO Auto-generated method stub
        while (koniec == 0) {
            System.out.println("_________________________");
            System.out.println("1.Wyświetl listę playlist");
            System.out.println("2.Dodaj playlistę");
            System.out.println("3.Wyświetl playlistę");
            System.out.println("4.Posortuj playlistę");
            System.out.println("5.Usuń playlistę");
            nr = odczyt.nextInt();
            switch (nr) {
            case 1: {
                System.out.println("Lista playlist: ");
                for (int i = 0; i < x; i++) {
                    System.out.println(i + ". " + Playlista.get(i).Nazwa());
                }
                break;
            }

            case 2: {
                System.out.print("Podaj nazwę nowej playlisty: ");
                nazwa11 = odczyt.next();
                Playlista.put(x, new Playlist(nazwa11));

                System.out.println("Dodano playlistę: "
                        + Playlista.get(x).Nazwa());
                x++;
                break;
            }
            case 3: {
                System.out.print("Podaj numer playlisty:");
                nr = odczyt.nextInt();
                Playlista.get(nr).wyswietlListe();
                break;
            }
            case 4: {
                System.out.print("Podaj numer playlisty:");
                nr = odczyt.nextInt();
                Playlista.get(nr).sortuj();
                break;

            }
            case 5: {
                System.out.print("Podaj numer playlisty:");
                nr = odczyt.nextInt();
                System.out.println("Skasowano playlistę: "
                        + Playlista.get(nr).Nazwa());
                Playlista.remove(nr);
                x--;
                break;
            }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您似乎不需要HashMap。

HashMap只是一个没有订单的键值存储。

在您的情况下,List似乎是更好的选择。它附带一个订单,因为它是它的主要观点。

您可以专门使用ArrayList

List<Playlist> playlists = new ArrayList<>();
playlists.add(new Playlist("Rock"));
// ...
Playlist p = playlists.get(index);

答案 1 :(得分:0)

如果您想要安全删除并获得正确的密钥,则必须迭代Map

int count = 0;
boolean found = false;
Iterator<Map.Entry<Integer,String>> iter = TestMap.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry<Integer,String> entry = iter.next();
    if("Sample".equalsIgnoreCase(entry.getValue())){
        iter.remove();   
        found = true;      
    }
    if (found) {
       // set the new key using count...
    }

    count ++;
}

答案 2 :(得分:0)

首先让我看看我是否正确理解了您的问题。你想在任何删除操作后重新下载播放列表。 1,2,3,4,5。你删除3,那么它应该是1,2,4,5而不是1,2,4,5。

如果以上是真的,最好使用linkedhashmap集合。 case1也可以重写为

case 1: {
                System.out.println("Lista playlist: ");
                for (Playlist pll:Playlista.values()) {
                    System.out.println(i + ". " + pll.Nazwa());
                }
                break;
            }