2

我正在上编程的初级课程,并尝试将 2 个列表组合成一个列表,并将新列表按数字顺序排列。我遇到问题的部分是,允许代码循环,重复这些步骤,以便它运行整个原始循环以完成最终列表,该列表是原始列表中所有数字的组合。任何有关循环的指导将不胜感激。谢谢你。

import inClass.list.EmptyListException;
import inClass.list.List;

public class InitialLists {

    public static void main(String[] args) {

    List<Integer> intObject1 = new List<Integer>();{

        intObject1.insertAtFront(25);

        intObject1.insertAtFront(19);

        intObject1.insertAtFront(3);

        intObject1.print();}

    List<Integer> intObject2 = new List<Integer>();{

        intObject2.insertAtFront(120);

        intObject2.insertAtFront(1);

        intObject2.print();}

    List<Integer> combinedList = new List<Integer>();

    int object1 = intObject1.removeFromBack();
    int object2 = intObject2.removeFromBack();

        while(intObject1.removeFromBack() != null && intObject2.removeFromBack() != null){

    try {


        {
            if (intObject1.removeFromBack() > intObject2.removeFromBack()) {
                combinedList.insertAtFront(object2);
                intObject1.insertAtBack(object1);
            }           
            else if (intObject2.removeFromBack() < intObject1.removeFromBack()) {
                combinedList.insertAtFront(object1);
                intObject2.insertAtBack(object2);
            }   
            else if (intObject1.removeFromBack() == intObject2.removeFromBack()) {
                combinedList.insertAtFront(object1);
            }
        }   
            combinedList.print();

            object1 = intObject1.removeFromBack();
            object2 = intObject2.removeFromBack();

        } // end try

        catch (EmptyListException emptyListException) {
            emptyListException.printStackTrace();
        } // end catch
        } //end while
    } // end main

}// end class
4

3 回答 3

1

关于什么:

List<Integer> combinedList = new ArrayList<Integer>();
combinedList.addAll(intObject1);
combinedList.addAll(intObject2);
Collections.sort(combinedList);

还是我错过了什么?

于 2012-10-06T21:45:08.523 回答
0

我猜你的问题是因为两个列表的大小可能不均匀。尝试将while条件如下:

Integer object1 = intObject1.removeFromBack();
Integer object2 = intObject2.removeFromBack();
while(object1 != null || object2!= null){
   if(object1 ==null){
       //safe to assume object2 is not null as both not null together (that is the termination condition)
       combinedList.insertAtFront(object2);
   }else if(object2 ==null){
       //safe to assume object1 is not null as both not null together (that is the termination condition)
       combinedList.insertAtFront(object1);
   }else{
       //put you normal condition of handling object1 and object2 being not null
        if (object1.intValue() > object2.removeFromBack()) {
            combinedList.insertAtFront(object2);
            intObject1.insertAtBack(object1);
        }           
        else if (object2.intValue() < object1.intValue()) {
            combinedList.insertAtFront(object1);
            intObject2.insertAtBack(object2);
        }   
        else if (object1.intValue() == object2.intValue()) {
            combinedList.insertAtFront(object1);
        }
   }
   object1 = null;
   object2 = null;
   try{
        object1 = intObject1.removeFromBack();
   }catch (EmptyListException emptyListException) {
       //do nothing
    } // end catch
   try{
        object2 = intObject2.removeFromBack();
   }catch (EmptyListException emptyListException) {
       //do nothing
    } // end catch
}

另请注意:有更好的方法来merge处理两个排序列表元素。鉴于您鲜为人知的自定义List类,建议使用此方法。

于 2012-10-06T22:04:09.700 回答
0

要合并两个文件/列表/流,您需要一个看起来有点像这样的循环

WHILE NOT FINISHED
    GET SMALLEST VALUE FROM INPUTS
    APPEND SMALLEST VALUE TO OUTPUT

那么你怎么知道你已经完成了?

您将如何获得每个列表中下一项中最小的一项?

我上面写的代码叫做伪代码;它是描述算法步骤的一种方式。继续扩展每个步骤,直到您拥有可以用您选择的语言(在本例中为 Java)实现的伪代码。

希望有帮助...

于 2012-10-06T21:53:44.413 回答