将两个arraylists排序为新的排序列表

时间:2017-11-23 18:59:12

标签: java android arraylist

我正在开展一个项目,所以我将问题简化为:

鉴于两个按降序排序的arraylists,我想把它们的每个值都放到一个新的arraylist中。

新的arraylist最大容量为5。

所以这似乎很容易也许我只是有一个脑力,但这里是我的代码,我一直得到nullpointer异常,我没有想法为什么

        int l1ptr = 0;
        int l2ptr = 0;
        while(searchList.size() < 5 || (listOne.get(l1ptr) == null && listTwo.get(l2ptr) == null)){
            if(listOne.get(l1ptr) == null){
                searchList.add(listTwo.get(l2ptr).document);
                l2ptr++;
            }else{
                if(listTwo.get(l2ptr) == null){
                    searchList.add(listOne.get(l1ptr).document);
                    l1ptr++;
                }else{
                    if(listOne.get(l1ptr).frequency < listTwo.get(l2ptr).frequency){
                        searchList.add(listTwo.get(l2ptr).document);
                        l2ptr++;
                    }else{
                        if(listTwo.get(l2ptr).frequency < listOne.get(l1ptr).frequency){
                            searchList.add(listOne.get(l1ptr).document);
                            l1ptr++;
                        }else{
                            searchList.add(listOne.get(l1ptr).document);
                            l1ptr++;
                        }
                    }
                }
            }

SearchList是我想要返回的新arraylist。

给出的两个列表是对象列表,它们存储字符串(文档)和数字(频率)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想要合并两个排序列表, 最多5个元素。 考虑这个通用逻辑:

  • 重复searchList.size() < 5 l1ptr不在第一个列表的末尾 l2ptr不是在第二个清单的末尾

    • 当你有5个元素或者到达其中一个列表的末尾时,循环将停止
  • 重复searchList.size() < 5 l1ptr不在第一个列表的末尾

    • 当你有5个元素或者到达第一个列表的末尾时,循环将停止
    • 请注意,如果您已经在第一个循环中到达第一个列表的末尾,那么此循环将不执行任何操作
  • 重复searchList.size() < 5 l2ptr不在第二个列表的末尾

    • 当你有5个元素或者到达第二个列表的末尾时,循环将停止
    • 请注意,如果您已经在第一个循环中到达第二个列表的末尾,那么此循环将不会执行任何操作
  • 最后,您将searchList包含最多5个元素,并且订购正确

像这样:

while (searchList.size() < 5 && l1ptr < listOne.size() && l2ptr < listTwo.size()) {
    if (listOne.get(l1ptr).frequency < listTwo.get(l2ptr).frequency) {
        searchList.add(listTwo.get(l2ptr).document);
        l2ptr++;
    } else {
        searchList.add(listOne.get(l1ptr).document);
        l1ptr++;
    }
}

while (searchList.size() < 5 && l1ptr < listOne.size()) {
    searchList.add(listOne.get(l1ptr).document);
    l1ptr++;
}

while (searchList.size() < 5 && l2ptr < listTwo.size()) {
    searchList.add(listTwo.get(l2ptr).document);
    l2ptr++;
}