0

我需要一个具有“启用”过滤器的列表,例如:

[
{
    "enabled": false,
    "value": {
        "number": 0
    }
},
{
    "enabled": true,
    "value": {
        "number": 1
    }
},
{
    "enabled": false,
    "value": {
        "number": 2
    }
},
{
    "enabled": true,
    "value": {
        "number": 3
    }
}
]

如果我要使用Iterable.iterator()或带有 get(i) 的标准 for 循环来遍历这个列表,打印每个“数字” ,它会输出:

1, 3

它的 size() 将返回 2。但如果我继续启用第一个元素,它将改为打印:

0, 1, 3

它的 size() 将返回 3。

有这样的标准实现吗?

该列表将具有对未过滤版本进行操作的操作,以便能够实际切换每个元素。

4

2 回答 2

1

我认为最简单的方法将是一个自定义集合,它只是将元素跳过到下一个enabled元素

public interface Enabled
{
    public boolean isEnabled();
}

public class EnabledCollection<T extends Enabled> implements List<T>
{
    private List<T> list = new ArrayList<T>();

    @Override
    public Iterator<T> iterator() {        
        Iterator<T> it = new Iterator<T>() {

            private int i = 0;

            @Override
            public boolean hasNext() {
                return i < list.size();
            }

            @Override
            public T next() {
                T o = list.get(++i);

                while (!o.isEnabled() && hasNext()) { o = list.get(++i); }

                return o;
            }

            @Override
            public void remove() {
                // todo
            }
        };

        return it;
    }

    @Override
    public T get(int i)
    {
        T o = list.get(i);

        while (!o.isEnabled() && i < list.size()) { o = list.get(++i); }

        return o;
    }

    // etc
}
于 2013-07-05T17:47:18.550 回答
0

我认为您必须覆盖一些标准对象才能获得此结果。

列表覆盖示例:覆盖 ArrayList 添加方法的问题

于 2013-07-05T17:11:06.747 回答