我在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)))
我很难再次寻求帮助,因为你的所有答案都对我很有帮助,但我无法弄明白这一点。
答案 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));