【问题标题】:Move Selected elements of a Map up or down [closed]向上或向下移动地图的选定元素[关闭]
【发布时间】:2013-05-03 22:14:07
【问题描述】:

我正在尝试通过向上或向下移动所选项目来修改 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;
    }
}

【问题讨论】:

    标签: java collections arraylist linkedhashmap generic-collections


    【解决方案1】:

    嗯,你想用 Map 做的最好是作为一个链接列表(你可以在其中简单地向上或向下移动元素)。我建议您创建一个简单的类来扩展链接列表并以 HashMap 作为成员,而不是所有这些复杂的机制。然后,您可以覆盖 add、delete 和 clear 方法,以便它们同时添加/删除/清除超级链表和 HashMap。

    这将使您同时获得 HashMap 和链表的好处,并且在概念上将更容易处理。

    【讨论】:

      【解决方案2】:

      Map 没有顺序的概念。 Map 中没有“旁边”、“上”或“下”。

      如果您想要一个保留顺序的Map,您可以使用基于插入顺序的LinkedHashMap,或者定义您自己的实现来施加您想要的任何顺序。如果您希望通过键定义顺序,那么TreeMap 可能是合适的,但是如果您更改项目的键,则必须将其删除并重新插入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2016-04-27
        • 1970-01-01
        相关资源
        最近更新 更多