2013-05-03 115 views
-1

我试图通过向上或向下移动选定的项目来修改Map中的元素列表。我的想法是记住所选项目旁边的元素。因为这些元素都在地图中,所以我发现要做到这一点非常困难,尽管我使用了LinkedHashMap 如果有人能给我一个关于如何去做的想法,我将不胜感激。将选定的元素向上或向下移动

注:我已经概括了这个问题,下面的代码只是一个参考。

public void moveUp(ActionEvent evt) { 
    List<String> selectedItems = myBean().getSelectedItems(); 
    if(selectedItems.isEmpty()) return; 
    Map<String, String> avlbleItems = new LinkedHashMap<String, String>(myBean().getListBoxItems()); 
    List<String> avlbleItemsList = new ArrayList<String>(myBean().getListBoxItems().values()); 
    int size = avlbleItems.size(); 
    List<String> tail = new ArrayList(); 
    List<String> head = new ArrayList(); 
    int buf = 0,k = 0,j = 0,m = 0,n = 0; 
    try { 
     label: 
     for (Iterator it = selectedItems.iterator(); it.hasNext();buf++) { 
      String st = (String) it.next(); 
      if(buf==0) { 
       for (int i = 0; i < size; i++) { 
        if(avlbleItemsList.get(i).equals(st)) { 
         k = i-1; 
         m = k+2; 
         n = m; 
        } 
       } 
       if(k < 0) return; 
       if(k == 0) continue label; 
      } 
      if(n < size && selectedItems.contains(avlbleItemsList.get(n))) { 
       n++; 
      } 
      if(k+2 < size && !selectedItems.contains(avlbleItemsList.get(k+2))) { 
       m++; 
      } 
      if(!it.hasNext()) { 
       for (int i = 0; i < size; i++) { 
        if(avlbleItemsList.get(i).equals(st)) { 
         j = i+1; 
         if(j == size) break label; 
         if(j < size) { 
          tail = avlbleItemsList.subList(j, size); 
         } 
        } 
       } 
      } 
     } 
     avlbleItems.clear(); 
     for (Iterator ite = head.iterator(); ite.hasNext();) { 
      String st = (String) ite.next(); 
      avlbleItems.put(st, st); 
     } 
     for (Iterator it = selectedItems.iterator(); it.hasNext();) { 
      String st = (String) it.next(); 
      avlbleItems.put(st, st); 
     } 
     avlbleItems.put(avlbleItemsList.get(k), avlbleItemsList.get(k)); 
     for (int i = n; i < j-1; i++) { 
      avlbleItems.put(avlbleItemsList.get(i), avlbleItemsList.get(i)); 
     } 
     for (Iterator it = tail.iterator(); it.hasNext();) { 
      String st = (String) it.next(); 
      avlbleItems.put(st, st); 
     } 
    } catch (IndexOutOfBoundsException e) { 
     handleException(); 
     return; 
    } catch (NoSuchElementException e) { 
     handleException(); 
     return; 
    } catch (IllegalArgumentException e) { 
     handleException(); 
     return; 
    } 
} 

回答

2

那么,你想要做什么与地图是最好的一个链接列表(你可以移动一个元素向上或向下)。我建议不要使用所有这些复杂的机制,而是制作一个简单的类来扩展链接列表,并将HashMap作为成员。然后,您可以重写添加,删除和清除方法,以便它们还可以添加/删除/清除超级链接列表和HashMap。

这将为您带来HashMap和链表的好处,并且在概念上会更容易处理。

1

A Map没有秩序的概念。在Map中没有“next”,“up”或“down”。

如果您想要保留订单Map您可以使用LinkedHashMap,它基于插入顺序,或者定义您自己的实现,并强制实施您想要的任何顺序。如果你想要通过键定义命令,那么TreeMap可能是合适的,但如果你改变了一个项目的键,你将不得不删除它并重新插入它。