根据指定的顺序添加列表的更有效方法

时间:2016-04-15 00:45:09

标签: java

我有三个不同的ArrayLists需要组合成一个,但是,它们在堆栈中的顺序很重要并且已指定。我怎样才能更有效地做到这一点?

代码正在做的是将ArrayList添加到完整ArrayList的适当级别(0,1,2),但是有太多重复的代码使得这个方法看起来很糟糕。

最终目标如下 - 我们关心的列与所需的顺序一起传递给我们的函数。然后,根据顺序,我们把它放在适当的位置,其他两列填充其余的(它们的顺序无关紧要)。

所以基本上,Column3被传递,例如,顺序2.这意味着我们希望完整的ArrayList是Column1的内容,然后是Column3的内容,然后是Column2的内容(其中) Column1和Column2可以交换,因为它们的顺序并不重要。)

感谢。

public void assemble(List<Card> selection, int order) {

        switch(order) {
            case 0:
                trickDeck.addAll(selection.stream().collect(Collectors.toList()));
                if (selection == column1) {
                    trickDeck.addAll(column2.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column3.stream().collect(Collectors.toList()));
                }
                else if (selection == column2) {
                    trickDeck.addAll(column1.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column3.stream().collect(Collectors.toList()));
                }
                else {
                    trickDeck.addAll(column1.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column2.stream().collect(Collectors.toList()));
                }
                break;
            case 1:
                if (selection == column1) {
                    trickDeck.addAll(column2.stream().collect(Collectors.toList()));
                    trickDeck.addAll(selection.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column3.stream().collect(Collectors.toList()));
                }
                else if (selection == column2) {
                    trickDeck.addAll(column1.stream().collect(Collectors.toList()));
                    trickDeck.addAll(selection.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column3.stream().collect(Collectors.toList()));
                }
                else {
                    trickDeck.addAll(column1.stream().collect(Collectors.toList()));
                    trickDeck.addAll(selection.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column2.stream().collect(Collectors.toList()));
                }
                break;
            case 2:
                if (selection == column1) {
                    trickDeck.addAll(column2.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column3.stream().collect(Collectors.toList()));
                    trickDeck.addAll(selection.stream().collect(Collectors.toList()));
                }
                else if (selection == column2) {
                    trickDeck.addAll(column1.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column3.stream().collect(Collectors.toList()));
                    trickDeck.addAll(selection.stream().collect(Collectors.toList()));
                }
                else {
                    trickDeck.addAll(column1.stream().collect(Collectors.toList()));
                    trickDeck.addAll(column2.stream().collect(Collectors.toList()));
                    trickDeck.addAll(selection.stream().collect(Collectors.toList()));
                }
                break;
            default:
                break;
        }
    }

1 个答案:

答案 0 :(得分:2)

我建议使用列索引而不是传入实际的List。然后我们可以将列操作为数组。这是一个未经测试的演示:

public void assemble(int selection, int position) {
    // create list of columns
    List<List<Card>> columns = Arrays.asList(column1, column2, column3);

    // if selected column is not located at position, swap:
    if (selection != position) {
        List<Card> temp = columns.get(position);
        columns.set(position, columns.get(selection));
        columns.set(selection, temp);
    }

    // add all columns to trickDeck in order
    columns.forEach(trickDeck::addAll);
}