排序的整数列表

时间:2014-11-07 20:33:54

标签: java

所以原始代码是

// An (unsorted) integer list class with a method to add an
// integer to the list and a toString method that returns the contents
// of the list with indices.
//
// ****************************************************************
public class IntList {

    private int[] list;
    private int numElements = 0;
    //-------------------------------------------------------------
    // Constructor -- creates an integer list of a given size.
    //-------------------------------------------------------------

    public IntList(int size) {
        list = new int[size];
    }
    //------------------------------------------------------------
    // Adds an integer to the list. If the list is full,
    // prints a message and does nothing.
    //------------------------------------------------------------

    public void add(int value) {
        if (numElements == list.length) {
            System.out.println("Can't add, list is full");
        } else {
            list[numElements] = value;
            numElements++;
        }
    }

    //-------------------------------------------------------------
    // Returns a string containing the elements of the list with their
    // indices.
    //-------------------------------------------------------------
    public String toString() {
        String returnString = "";
        for (int i = 0; i < numElements; i++) {
            returnString += i + ": " + list[i] + "\n";
        }
        return returnString;
    }
}

// ***************************************************************
// ListTest.java
//
// A simple test program that creates an IntList, puts some
// ints in it, and prints the list.
//
// ***************************************************************
import java.util.Scanner ;

public class ListTest {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        IntList myList = new IntList(10);
        int count = 0;
        int num;
        while (count < 10) {
            System.out.println("Please enter a number, enter 0 to quit:");
            num = scan.nextInt();
            if (num != 0) {
                myList.add(num);
                count++;
            } else {
                break;
            }
        }
        System.out.println(myList);
    }
}

我需要更改add方法以从最低到最高排序。这就是我尝试过的。

// An (unsorted) integer list class with a method to add an
// integer to the list and a toString method that returns the contents
// of the list with indices.
//
// ****************************************************************
public class IntList {

    private int[] list;
    private int numElements = 0;
    //-------------------------------------------------------------
    // Constructor -- creates an integer list of a given size.
    //-------------------------------------------------------------

    public IntList(int size) {
        list = new int[size];
    }
    //------------------------------------------------------------
    // Adds an integer to the list. If the list is full,
    // prints a message and does nothing.
    //------------------------------------------------------------

    public void add(int value) {
        if (numElements == list.length) {
            System.out.println("Can't add, list is full");
        } else {
            list[numElements] = value;
            numElements++;
            for (int i = 0; i < list.length; i++) {
                if (list[i] > value) {
                    for (int j = list.length - 1; j > i; j--) {
                        list[j] = list[j - 1];
                        list[i] = value;
                        break;
                    }
                }
            }

            for (in i = 0; i < list.length; i++) {

            }
        }
    }
    //-------------------------------------------------------------
    // Returns a string containing the elements of the list with their
    // indices.
    //-------------------------------------------------------------

    public String toString() {
        String returnString = "";
        for (int i = 0; i < numElements; i++) {
            returnString += i + ": " + list[i] + "\n";
        }
        return returnString;
    }
}

结果非常错误。谁能够引导我朝着正确的方向前进?我可以理解为什么我的东西不起作用,但我看不到足以修复它。

所以我第一次意识到我在这里不是很具描述性。除了add方法修改之外,代码不是我做的。我的任务是只触摸add方法对数组进行排序,以打印出从最小到最大的数据。这是一个初学者类,我们几乎没有练习我唯一的工具是对循环和数组的一些基本理解。

我再次尝试重做它并想出了这个:

if(list[numElements-1] > value){

for(int i=0; i<numElements; i++){

    if(list[i]>value){

        for(int j = numElements; j>i; j-- ){

            list[j] = list[j-1];
            }
        list[i] = value;
        break;
        }
        }

numElements++;  
}
else 
{
    list[numElements] = value;
    numElements++;
}

我的输入是:8,6,5,4,3,7,1,2,9,10 产出为:1,10,1,9,10,1,1,2,9,10

这件事正在踢我的屁股。我理解我想要检查数组的输入数字并将所有数字移动到一个空格以上,并将其输入后面,以便在输入时对其进行排序,但这样做对我来说很难。我很抱歉,如果我的代码在这里难以理解,格式化对我来说有点奇怪,时间只允许我尽我所能。我认为休息并没有打破for循环我喜欢我想它会。也许这就是问题所在。

8 个答案:

答案 0 :(得分:1)

我看到的最大错误是在list.length循环中使用for

for(int i = 0; i <list.length; i++)

你有numElements。另外,我认为i之前需要停止一个,

for(int i = 0; i < numElements - 1; i++)

然后

for (int j = numElements; j > i; j--)

答案 1 :(得分:1)

有两条线必须移出内环:

        for (int i = 0; i < list.length; i++) {
            if (list[i] > value) {
                for (int j = list.length - 1; j > i; j--) {
                    list[j] = list[j - 1];
                    // list[i] = value;
                    // break;
                }
                list[i] = value;
                break:
            }
        }

特别是,内部中断意味着应该移动所有较大元素以便为新值腾出空间的循环只运行一次。

答案 2 :(得分:0)

您可能希望包含具有自己的排序功能的Java.util.Arrays:

http://www.tutorialspoint.com/java/util/arrays_sort_int.htm

然后你可以这样做:

public void add(int value) {
    if (numElements == list.length) {
        System.out.println("Can't add, list is full");
    } 
    else {
        list[numElements] = value;
        numElements++;
        Arrays.sort(list);
        //Or: Java.util.Arrays.sort(list);
    }
}

答案 3 :(得分:0)

正如Eliott所说,您在list.length(列表的容量)和numElements(您当前的尺寸)之间感到困惑列表)。但是,如果您只是确保首先将每个新元素插入到正确的位置,则不需要在每次添加时对列表进行完全排序。您可以依赖列表的其余部分进行排序。这是一种简单快捷的方法:

public void add(int value) {
    if (numElements == list.length) {
        System.out.println("Can't add, list is full");
    } else {
        int insertionPoint = Arrays.binarySearch(list, 0, numElements);

        if (insertionPoint < 0) {
            insertionPoint = -(insertionPoint + 1);
        }

        System.arrayCopy(list, insertionPoint, list, insertionPoint + 1,
                numElements - insertionPoint);

        list[insertionPoint] = value;
        numElements += 1;
    }
}

这会表现得更好(尽管你可能不关心这项任务),而且更容易看到发生了什么,至少对我而言。

答案 4 :(得分:0)

以下是一些提示。

首先,numElements表示列表中当前有多少元素。如果您在完成项目添加后更改它,那就是最好的方法,就像原始方法一样。否则,你可能会误以为你有更多的元素,而不是你现在的元素。

实际上不需要嵌套循环来进行适当的添加。你应该遵循的逻辑是:

  1. 我知道列表中的所有内容都已排序。
  2. 如果我的号码大于最大号码(由numElements-1索引的号码,因为列表已排序),那么我可以将我的号码添加到阵列中的下一个可用小区(由{编制索引) {1}})然后更新numElements并完成。
  3. 如果没有,我需要从数组中的最后一个元素开始(小心,不要查看数组的numElements。最后一个元素由length索引!) ,向下,并将每个第一个单元格向右移动。当我击中低于我的号码的单元格时,我会停下来。
  4. 向右移动所有高位数的一个单元格会导致一个单元格变为空白&#34;。这是我要把我的号码放在哪里。更新numElements-1,然后完成。
  5. 假设您要将数字numElements添加到此数组:

    ┌─┬──┬──┬─┬─┐
    │3│14│92│-│-│
    └─┴──┴──┴─┴─┘
          ⬆︎ Last element
    

    您将从最后一个元素(92)开始的所有内容移动到右侧。您在7停留,因为它不大于3

    ┌─┬─┬──┬──┬─┐
    │3│-│14│92│-│
    └─┴─┴──┴──┴─┘
    

    (第二个元素可能仍然包含14个,但您将在下一步中更改它,所以它并不重要。我只是在其中放置一个7来指示它&# 39;现在可以免费输入你的号码)

    ┌─┬─┬──┬──┬─┐
    │3│7│14│92│-│
    └─┴─┴──┴──┴─┘
            ⬆︎ Updated last element
    

    这只需要一个循环,不需要嵌套。小心并记住数组从0开始,因此如果您的数字恰好低于最低数字,则必须确保不要获得-

答案 5 :(得分:0)

我发现的一个问题是:您正在尝试将新添加的数字插入数组中。但是你的循环:

for (int i = 0; i < list.length; i++) {
    if (list[i] > value) {
        for (int j = list.length - 1; j > i; j--) {
             list[j] = list[j - 1];
             list[i] = value;
             break;
        }
    }
}

始终循环遍历数组的总长度,在测试中总是为10,而不是数组的实际长度,即数组中实际有多少个数。

例如,当您添加第一个元素时,它仍会循环遍历数组的所有10个元素,尽管最后9个插槽没有值并自动指定为零。

这导致if语句始终返回true:

if (list[i] > value)

如果您必须自己编写排序算法,请使用常用的排序算法之一,该算法可以在维基百科中找到。

答案 6 :(得分:0)

如果有人好奇我终于解决了。谢谢所有回复的人。这就是我最终的结果。

 public void add(int value)
 {
  if(numElements == 0){
     list[numElements] = value;
     numElements++;

  }
  else{
     list[numElements] = value;
     for(int check = 0; check < numElements; check++){
        if(list[check] > value){
           for(int swap = numElements; swap> check; swap--){
              list[swap] = list[swap-1];
           }
           list[check] = value;

           break;
        }
                 }
                 numElements++;
  } 

}

答案 7 :(得分:0)

所以我的原著是一样的,但我们必须再上一堂课

排序的整数列表

文件IntList.java包含一个整数列表类的代码。将其保存到您的项目中并进行研究;请注意,您唯一可以做的就是创建一个固定大小的列表并将一个元素添加到列表中。如果列表已满,将显示一条消息。文件ListTest.java包含用于创建IntList的类的代码,该类将一些值放入其中并进行打印。将其保存到您的文件夹中,然后编译并运行它以查看其工作原理。

现在编写一个扩展IntList的类SortedIntList。 SortedIntList应该和IntList一样,除了它的元素应始终按从小到大的顺序排列。这意味着,将元素插入SortedIntList时,应将其放置在其已排序的位置,而不仅仅是数组的末尾。为此,您需要在添加新元素时做两件事:

遍历数组,直到找到应该放置新元素的位置。由于列表已经排序,因此您可以继续查看元素,直到找到至少与要插入的元素一样大的元素为止。 向下移动将在新元素之后的所有元素,即从停止到结束的所有元素。这将创建一个插槽,您可以在其中放置新元素。请注意它们的移动顺序,否则将覆盖数据! 现在,您可以将新元素插入到您最初停在的位置。

所有这些都将放入您的add方法中,该方法将覆盖IntList类的add方法。 (请确保还检查是否需要扩展数组,就像IntList add()方法一样。)还需要重写其他哪些方法(如果有)?

要测试您的类,请修改ListTest.java,以使其在创建并打印IntList之后创建并打印包含相同元素(以相同顺序插入)的SortedIntList。在打印列表时,它们应按排序顺序显示。