无法打印出ArrayList(代码中可能的逻辑错误)

时间:2014-02-06 14:19:36

标签: java list arraylist mergesort

我在java中创建一个执行MergeSort算法的MergeSort类。我已经尝试了多种方法来打印出我最后返回控制台的方法,但无论我做了什么,它都会打印掉任何对象的gobbledeegook。

这是我的伪代码(如果有任何逻辑错误,请告诉我)

/**
*merge(A, B):
*C = empty list 
*
*While A and B are not empty:
*   If the first element of A is smaller than the first element of B:
*       Remove the first element of A
*       Add it to the end of C
*   Else
*       Remove first element of B
*       Add it to the end of C
*
*If A or B still contains elements, add them to the end of C
*
*mergeSort(A):
*   if length of A is 1:
*       return A
*
*   Split A into two lists, L and R
*
*   Q = merge(mergeSort(L), mergeSort(R))
*
*   return Q
*/

这是我的实际代码:

import java.util.ArrayList;

public class MergeSort {
    public static void main(String[] args) {
        ArrayList<Object> List = new ArrayList<Object>();
        List.add(new Object[]{412, 491, 312, 265, 295, 253, 278});

        ArrayList<Object> Q = MergeSort.mergeSort(List);
        MergeSort.printArrayList(Q);
    }

    @SuppressWarnings("null")
    public static ArrayList<Object> merge(ArrayList<Object> A, ArrayList<Object> B) {
        ArrayList<Object> C = null;

        while (!A.isEmpty() && !B.isEmpty()) {
            if ((int) A.get(0) < (int) B.get(0)) {
                C.add(A.get(0));
                A.remove(0);
            } else {
                C.add(B.get(0));
                B.remove(0);
            }
        }

        return C;
    }

    public static ArrayList<Object> mergeSort(ArrayList<Object> A) {
        if (A.size() == 1) {
            return A;
        }

        ArrayList<Object> L = (ArrayList<Object>) A.subList(0, A.size() / 2);
        ArrayList<Object> R = (ArrayList<Object>) A.subList(A.size() / 2 + 1, A.size() + 1);

        ArrayList<Object> Q = merge(mergeSort(L), mergeSort(R));

        return Q;
    }

    public static void printArrayList(ArrayList<Object> Q) {
        Object[] P = new Object[Q.size()];
        Q.toArray(P);

        for (Object c : P) {
            System.out.print(c.toString() + " ");
        }
    }

}

非常感谢任何帮助(我对ArrayLists或列表不是很有经验)

这是我在给出你所有建议后得到的新代码。

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

public class MergeSort
{
public static void main(String[] args)
{
    List<Integer> list = new ArrayList<Integer>(); //(Arrays.asList(412, 491,  312, 265, 295, 253, 278));
    list.addAll(Arrays.asList(412,491,312,265,295,253,278));

    List<Integer> sortedList = MergeSort.mergeSort(list);
    MergeSort.printList(sortedList);
}

public static List<Integer> merge(List<Integer> firstHalf, List<Integer> secondHalf)
{
    List<Integer> mergedList = new ArrayList<>();

    while((!(firstHalf.size() == 0)) && (!(secondHalf.size() == 0)))
    {
        if((int)firstHalf.get(0) < (int)secondHalf.get(0))
        {
            mergedList.add(firstHalf.get(0));
            firstHalf.remove(0);
        }
        else
        {
            mergedList.add(secondHalf.get(0));
            secondHalf.remove(0);
        }
    }

    if(firstHalf.size() > 0)
    {
        for(Integer c : firstHalf)
        {
            mergedList.add(c);
        }
    }
    else
    {
        for(Integer c : secondHalf)
        {
            mergedList.add(c);
        }
    }



    return mergedList;
}

public static List<Integer> mergeSort(List<Integer> list)
{
    if(list.size() == 1)
    {
        return list;
    }

    List<Integer> firstHalf = list.subList(0, list.size() / 2);
    List<Integer> secondHalf = list.subList(list.size() / 2 + 1, list.size());

    List<Integer> sortedList = merge(mergeSort(firstHalf), mergeSort(secondHalf));

    return sortedList;
}

public static void printList(List<Integer> sortedList)
{
    for(Integer c : sortedList)
    {
        System.out.print(c.toString() + " ");
    }
}

}

我一直收到ConcurrentModificationException,但我没有使用任何线程。错误发生在第22,66和14行。while((!(firstHalf.size() == 0)) && (!(secondHalf.size() == 0)))

我很难再次寻求帮助,因为你的所有答案都对我很有帮助,但我无法弄明白这一点。

4 个答案:

答案 0 :(得分:0)

toArray方法返回一个新数组(因此您的P数组为空)。这样的事情应该有效:

public static void printArrayList(ArrayList<Object> Q)
{
    for(Object c : Q)
    {
        System.out.print(c.toString() + " ");
    }
}

答案 1 :(得分:0)

您正在使用单个数组而不是一堆数字初始化list变量。因此,您最终会得到一个二维数组,如果您这样做,可以看到

System.out.println(Arrays.deepToString(P)); 

请尝试这样:

List<Object> list = new ArrayList<Object>(Arrays.asList(412, 491, 312, 265, 295, 253, 278));

这会在您的代码中显示一系列其他问题,例如您尝试将List返回subList()转换为ArrayList,并且您将其移出您List的边界。

改为将所有ArrayList引用变量更改为List类型,并重新考虑有关索引的逻辑。

答案 2 :(得分:0)

您应该更改数据结构。

new Object[]{412, 491, 312, 265, 295, 253, 278} //this will return an array of objects

现在将它作为对象存储在列表中:

ArrayList<Object> List = new ArrayList<Object>();

然后你的问题是你无法访问它。改为:

ArrayList<Object[]> List = new ArrayList<Object[]>();

然后你可以像这样打印出来:

        for(Object[] objarray : List)
            for(Object number : objarray)
                System.out.println(number);

答案 3 :(得分:0)

以下代码有一些改进:

1)在左侧使用List代替ArrayList

List<Integer> list = new ArrayList<Integer>();

2)不要将Object用于泛型,而是使用necessery类(在你的情况下是整数)

3)不要使用大写的变量名称straring而不是用一个字母给它们命名。这不是代码阅读器的信息。给出这样的名字:

List<Integer> sortedList = MergeSort.mergeSort(list);

4)初始List如下:

List<Integer> list = new ArrayList<Integer>();
list.addAll(Arrays.asList(412,491,312,265,295,253,278));

or
List<Integer> list = new ArrayList<Integer>(Arrays.asList(412,491,312,265,295,253,278));

5)     list.subList(list.size()/ 2 + 1,list.size());

而不是:

list.subList(list.size() / 2 + 1, list.size() + 1);

您将获得java.lang.IndexOutOfBoundsException

6)你声明List<Integer> C = null;然后访问它C.add(A.get(0)); 。在访问之前初始化列表。

 List<Integer> C = new ArrayList<>();
 C.add(A.get(0));