如何不使用内置库方法对ArrayList进行排序? (Java)

时间:2018-11-28 06:05:37

标签: java arraylist

我需要编写一个方法来对ArrayList进行升序排序,而无需使用任何内置库或方法(不包括java.util.ArrayList,它可能用于允许ArrayList,但仅此而已)。我下面有几乎完整的代码,但是.remove()函数似乎无法正常工作;它什么也不做,并且ArrayList最终成为在ArrayList的整个大小中重复的最小元素。我尝试用更新段为tempDataCopy.remove(smallestElementIndex)的for循环替换while循环,但它给出了多个错误,说.remove()函数具有“未知源”。我该如何解决?

    public static ArrayList<Integer> sortUp(ArrayList<Integer> data) {
    ArrayList<Integer> increasingArray = new ArrayList<Integer>();
    ArrayList<Integer> tempDataCopy = data;// tempDataCopy was created so that elements may be deleted without affecting the actual ArrayList data
    int smallestElement = tempDataCopy.get(0);
    int smallestElementIndex = 0;
    while (tempDataCopy.size() > 0) {
        for (int i = 0; i < tempDataCopy.size(); i++) {
            if (tempDataCopy.get(i) < smallestElement) {
                smallestElement = tempDataCopy.get(i);
                smallestElementIndex = i;
            } // end if statement
        } // end for loop
        increasingArray.add(smallestElement);
        tempDataCopy.remove(smallestElementIndex);
    } // end while loop
    return increasingArray;
}// end sortUp

很抱歉,如果重复的话,我搜索了几个小时,却找不到另一个类似排序的示例。

2 个答案:

答案 0 :(得分:0)

public static ArrayList<Integer> sortUp(ArrayList<Integer> data) {
  ArrayList<Integer> increasingArray = new ArrayList<Integer>();
  ArrayList<Integer> tempDataCopy = new ArrayList<>(data);// tempDataCopy was created so that elements may be deleted without affecting the actual ArrayList data

  // moved initialization of smallestElement in while loop
  while (tempDataCopy.size() > 0) {
    int smallestElement = tempDataCopy.get(0);
    int smallestElementIndex = 0;
    for (int i = 1; i < tempDataCopy.size(); i++) {
        if (tempDataCopy.get(i) < smallestElement) {
            smallestElement = tempDataCopy.get(i);
            smallestElementIndex = i;
        } // end if statement
    } // end for loop
    increasingArray.add(smallestElement);
    tempDataCopy.remove(smallestElementIndex);     
  } // end while loop
  return increasingArray;
}// end sortUp

这会将最小元素重置为每个while循环迭代的第一个元素。对于此示例,您发生了错误:4、3、2、1。

第一次while循环迭代后,您的tempDataCopy如下所示:4,3,2

但是您的minimumElement仍然为1,并且在下一次迭代中找不到较小的值。因此,您要再次添加1并尝试删除索引3中不再存在的元素

关于您的错误,我不认为错误提示remove方法是未知的,但是要删除的元素不存在。

答案 1 :(得分:0)

您必须删除此代码并将其放入if条件中。

increasingArray.add(smallestElement);
tempDataCopy.remove(smallestElementIndex);