当前位置: 首页 > 知识库问答 >
问题:

Java:向ArrayList

狄玉书
2023-03-14

我正在尝试用Java编写一个程序,该程序将计算整数数组(具有5个元素)中的所有元素组合,并将这些组合输出到ArrayList。我在下面包含了我的代码。

我使用按位运算来查找组合。每个组合都构造为一个 ArrayList(Integer),称为“writeitem”。然后我想将它们存储在另一个名为“master”的ArrayList中,它必须具有ArrayList(ArrayList(Integer))的形式。[出于格式原因

当尝试将每个组合保存到“master”ArrayList时会出现问题。如果您运行下面的代码,printf函数将显示组合构造正确。但是,一旦我要求将其“添加”到“master”,它似乎不会附加到“master”的末尾。相反,所有“master”都被刚刚构造的组合的i个副本覆盖。

因此,例如,如果我调用[1,2,3,4,5]上的函数,我的“主”数组最终是[1,3,3,5]的31个副本(要找到的第31个组合)。

我想这与使用嵌套数组列表有关,并且有更好的方法来实现我想要的。但是同样有可能我犯了一些其他的新手错误。

static ArrayList<ArrayList<Integer>> master = new ArrayList<ArrayList<Integer>>();
public static void generatecombs(int[] x){

    ArrayList<Integer> writeitem = new ArrayList<Integer>(); //empty list to construct each comb

    for(int i=1;i<32;i++){

        writeitem.clear(); //clear before constructing next combination

        if((i & 1)>0){          //check if each element is present in combination
            writeitem.add(x[0]);
        }
        if((i & 2)>0){
            writeitem.add(x[1]);
        }
        if((i & 4)>0){
            writeitem.add(x[2]);
        }
        if((i & 8)>0){
            writeitem.add(x[3]);
        }
        if((i & 16)>0){
            writeitem.add(x[4]);
        }

        System.out.printf("The %dth combination is %s\n", i,writeitem);
        master.add(writeitem); //output constructed element
        System.out.printf("The collection so far is: %s\n", master);
    }
}

共有3个答案

山越
2023-03-14

另一种解决方案是在清除writeItem之前,在添加到父列表时进行克隆。

master.add(writeitem.clone()); 
邴俊民
2023-03-14

将< code>writeitem的构造移到for循环内。您不想重复使用同一个数组

司空宣
2023-03-14

在循环内移动新

static ArrayList<ArrayList<Integer>> master = new ArrayList<ArrayList<Integer>>();

public static void generatecombs(int[] x){

    for(int i=1;i<32;i++){

        ArrayList<Integer> writeitem = new ArrayList<Integer>(); // new list to construct each comb
        if((i & 1)>0){          //check if each element is present in combination
            writeitem.add(x[0]);
        }
        if((i & 2)>0){
            writeitem.add(x[1]);
        }
        if((i & 4)>0){
            writeitem.add(x[2]);
        }
        if((i & 8)>0){
            writeitem.add(x[3]);
        }
        if((i & 16)>0){
            writeitem.add(x[4]);
        }

        System.out.printf("The %dth combination is %s\n", i,writeitem);
        master.add(writeitem); //output constructed element
        System.out.printf("The collection so far is: %s\n", master);
    }
}
 类似资料:
  • 问题内容: 如何从最后一项到第一个迭代一个项目? 问题答案: 如果要继续使用集合,可以使用以下方法: 如果您可以改用数组,则可以看一下answer。

  • 问题内容: 我想做的是,当他们最初使用此方法时,进入免责声明页面,然后在此之后的任何时候都转到另一个页面。我当前的方法只是带给我免责声明页面。让我知道是否需要进一步解释…谢谢!!! 基本上,我需要在第一次点击此方法时添加一个If来转到页面,我想是这样的: 问题答案: 当该人第一次点击该页面时,在会话层上抛出一个标志。然后,无论何时有人进入页面,您都可以检查它是否存在,并相应地重定向他们。唯一的问题

  • 问题内容: 大家都说,由于性能的原因,应该使用vector(因为Vector在每次操作和所有操作之后都会同步)。我写了一个简单的测试: 结果如下: 基于此,似乎在遍历和阅读方面的表现要好一些。也许这是一个愚蠢的任务,或者我做出了错误的假设-有人可以解释一下吗? 问题答案: 您已经编写了一个幼稚的微基准测试。在JVM上进行微基准测试是一项非常棘手的事情,要列举所有的陷阱甚至不容易,但是这里有一些经典

  • 问题内容: 一般问题:反向流的正确方法是什么?假设我们不知道流包含什么类型的元素,反转任何流的通用方法是什么? 具体问题: IntStream提供了range方法来生成特定范围内的,现在我想将其从0切换为负数将无法正常工作,也无法使用 与IntStream我会得到这个编译器错误 错误:(191,0)ajc:sorted()类型中的方法IntStream不适用于参数(Integer::compare

  • 问题内容: 有人可以告诉我为什么我的代码有效吗?我想在Java中反转单个链接列表:这是方法(无法正常工作) 这是Node类: 在输入4-> 3-> 2-> 1上,我得到了输出4。我对其进行了调试,它正确设置了指针,但是我仍然不明白为什么它仅输出4。 问题答案: Node next = tmp.next; while(tmp != null){ 那么,当tmp == null时会发生什么呢? 不过,

  • 问题内容: 我正在使用Spring Framework3。我有一个表单,用于向文章发布评论。提交表单后,将检查是否有任何错误。如果没有错误,则控制器返回字符串 而且一切都很好。 但是当有一些错误时,如果控制器返回 错误应使用spring-form.tld标签在表单附近显示: 但是没有显示的错误!当我试图返回时 如果没有重定向:前缀,那么它将转到/rus/WEB- INF/jsp/entryView