在Arraylist中查找名称,然后将内容传输到数组?

时间:2017-09-12 05:28:16

标签: java arrays arraylist

我想在学生的ArrayList中找到我的名字,然后将我选择的50个选项转移到一个名为myChoices的新数组(稍后将与其他人进行比较以进行匹配)。 Student类包含一个名称和一个ArrayList选项。以下是相关循环:

int matches[] = new int[students.size()];
int myChoices[] = new int[students.get(0).getChoices().size()];

for(int i = 0; i < students.get(i).getChoices().size(); i++){
    if(students.get(i).getName().equals("Garrett M")){
        myChoices[i] = students.get(i).getChoices().get(i);
    }
}

for(int i = 0; i < myChoices.length; i++){
    System.out.println(myChoices[i]);
}

在最后一个循环中,我只是试图打印我的选择,其结果如下:

0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0 
0
0
0
0
0
0
0
0
0

(那不是50,但是你得到了它的要点 - 在输出中有大约49个零和1个。)实际输出应该从1开始并且是0的混合,1和-1:

1 -1 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 -1 0 1 0 0 0 0 1 1 1 1 0 1

我知道哪里出错了?

3 个答案:

答案 0 :(得分:1)

您对i列表和students列表使用相同的索引students.get(i).getChoices()。这可能是错的。

您可能需要一个嵌套循环:

for(int i = 0; i < students.size(); i++) { // iterate over the students to find the one
                                           // having the required name
    if(students.get(i).getName().equals("Garrett M")){
        // iterate over the choices of the found student and collect them into the array
        for (int j = 0; j < students.get(i).getChoices().size; j++) {
            myChoices[j] = students.get(i).getChoices().get(j);
        }
        break;
    }
}

答案 1 :(得分:0)

通过在if循环中编写if语句,你只设置mychoices []数组的特定元素,它与你的名字(Garrett M)匹配,所有数组元素将保持不变,这就是为什么你得到49个零和1个

答案 2 :(得分:0)

有时,命令式编程可能会导致许多for循环混乱。 从很多年以来,我们在代码中使用for的次数太多了。使用Java 8,可以用声明式代码编写代码。以声明式样式编写的代码更易于阅读和理解。

只需添加 @Eran 已经回答的问题,我将尝试使用Java 8 Stream API简化相同的解决方案。有一天,如果不是今天,这对你来说可能会派上用场。

手头的问题是获取特定学生的选择,并将这些选择添加到数组(或集合)中。

这可以按如下方式完成:

List<Integer> myChoicesList = students.stream()
                .filter(student -> student.getName().equals("Garrett M"))
                .map(student -> student.getChoices()) 
                .findFirst()
                .get();
  • 在第一步中,将students列表转换为Java 8 Stream。 记住Stream是一个抽象:

    students.stream()

  • 接下来,过滤掉您所在的某个特定学生 感兴趣的是:

    filter(student -> student.getName().equals("Garrett M"))

  • 此时,Stream包含了一名学生 过滤。但我们对这名学生的choices感兴趣 具有。因此,将此Student流转换为流 choices

    .map(student -> student.getChoices())

  • 既然您有自己的选择,就可以执行所需的操作 对他们的操作。而已!!完成!!

    findFirst().get();

这会给你一个List<Integer>。稍后您可以将此集合转换为Integer数组:

Integer[] myChoices = myChoicesList.toArray(new Integer[myChoicesList.size()]);

注意:我设计了此代码段,假设来自getChoices()类的Student方法返回包含List<Integer>选项的Student