2015-05-13 64 views
0

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

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; 
      } 
      } 
     } 
    } 
} 
+0

首先,为什么你使用地图而不是数组? – mkrakhin

+0

“Map”不能保证其条目中有任何顺序(然而'SortedMap'不会);更重要的是你不可能拥有一把钥匙而没有价值:最坏的情况下,它的价值将是空的。 – fge

+0

这是我的大学课程的一个项目,我被告知使用hashmap。 – EyeMaze

回答

0

你似乎不需要一个HashMap。

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

就你而言,List似乎是一个更好的选择。它是一个订单,因为它是它的主要观点。

您可以专门使用一个ArrayList

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

你是完全正确的@Jean,但他说:*这是我的大学课程的一个项目,我被告知使用HashMap * –

+0

练习与否,只要Map有一个索引键,然后它应该是一个ArrayList。 –

+0

不可以,你可以用索引 –

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 ++; 
} 
+0

嘿,你是什么意思设置新的密钥?我也不确定我了解变量计数的作用。 – EyeMaze

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; 
      }