将多个arraylist连接到一个单个数组列表

时间:2011-09-09 05:17:09

标签: java arraylist

我有一个数组列表的数组列表,我想对它进行单独的视图,它将从中过滤某些内容并将其存储在某个地方供以后使用。我正在计划使用数组列表的数组列表,并想知道数组列表是否有一种方式连接在一起,其中一个变化反映另一个?有什么想法吗 ?它就像一张excel表格,我想过滤掉某些数字,我会显示同一张纸的另一个视图,而不会真正改变原始纸张。请帮忙。

2 个答案:

答案 0 :(得分:1)

这是一个完整的,可执行的演示版。您应该能够按原样编译和运行。我没有添加评论或错误检查,但它应该按照你的要求做。列表清单是否是您当前情况的最佳选择,我不知道。您的行具有名称和年龄这一事实使我认为您不需要列表列表,而是需要特定类的行对象列表。 (或者,您可以在任何地方使用List<?>List<Object>。)

尽管如此,您可能会对以下内容感兴趣。您可能可以使用它,或者它可能会吓跑您远离列表列表方法。 :)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * A ragged 2-D table of strings that supports "views" (arbitrary rows).
 *
 * WARNING: no error checking.  This is just a sketch.
 */
public class Table {

    private List<List<String>> data;
    private List<Integer> activeRows = new ArrayList<Integer>();

    public Table(List<List<String>> data) {
        this.data = data;
    }

    public void setActiveRows(List<Integer> activeRows) {
        this.activeRows = activeRows;
    }

    public void update(int row, int column, String value) {
        data.get(row).set(column, value);
    }

    public void show() {
        for (Integer row: activeRows) {
            System.out.println(data.get(row));
        }
    }

    /**
     * DEMO.  Normally we don't put main methods inside a class.  This is just a sketch.
     */
    public static void main(String[] args) {
        List<List<String>> a = Arrays.asList(
            Arrays.asList("abc", "def", "ghi"),
            Arrays.asList("ABC", "DEF", "GHI"),
            Arrays.asList("zzz", "yyy", "xxx"),
            Arrays.asList("dog", "cat", "rat")
        );

        // Make two tables that share the same data
        Table t1 = new Table(a);
        Table t2 = new Table(a);

        // t1 will have all four rows; t2 just two of them.
        t1.setActiveRows(Arrays.asList(0, 1, 2, 3));
        t2.setActiveRows(Arrays.asList(1, 3));

        // Show them
        t1.show();
        System.out.println();
        t2.show();
        System.out.println();

        // Now change part of t1 and show that this is reflected in t2.
        t1.update(1, 2, "NEWVALUE");

        // And show them again
        t1.show();
        System.out.println();
        t2.show();
        System.out.println();
    }
}

输出是:

[abc, def, ghi]
[ABC, DEF, GHI]
[zzz, yyy, xxx]
[dog, cat, rat]

[ABC, DEF, GHI]
[dog, cat, rat]

[abc, def, ghi]
[ABC, DEF, NEWVALUE]
[zzz, yyy, xxx]
[dog, cat, rat]

[ABC, DEF, NEWVALUE]
[dog, cat, rat]

答案 1 :(得分:0)

根据你对问题的解释,你可以保留一个排序列表..然后做一个子集(探索导航集并查看它是如何实现的)..将你的子集包装成一个不可修改的列表或者新的列表,无论何时暴露它。 如果您希望遇到重复项,也可以使用已排序/可导航的地图..因此地图中的值可以是重复的数量。现在,当您查询此地图的头部或尾部以返回视图时,您可以使用重复次数来获得所需的列表。

    NavigableSet<Integer> orderedSet = new ConcurrentSkipListSet<Integer>(Arrays.asList(new Integer[] {11, 20, 32, 14,
            5})); // or tree set if thread safety is not a concern.
    orderedSet.headSet(20); // will give you integers upto 20 i.e. [5, 11, 14]