数组在第一次通过后保持排序,不知道为什么 [关闭]

array staying sorted after first pass not sure why [closed]

提问人:hipposaver 提问时间:11/14/2023 最后编辑:Abrahipposaver 更新时间:11/14/2023 访问量:60

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

6天前关闭。

从我的标题可以看出,我不太确定该如何措辞。我只是回到一些编码和做基本练习。我认为从排序算法开始会很棒。我正在尝试加载文件,然后对其进行排序。到目前为止,我有 3 种算法编码。希望我发布的内容足以让你们了解这个问题。

我的排序类正在更改我的数组,即使我正在尝试更新不同的数组。

我首先使用我调用的函数从文件中加载数组 - 它工作正常。ReadFileToArray

int[] arr;
int[] sortedArray;
String fp = "C:/Users/test.txt";
arr = ReadFileToArray(fp);

然后,我使用排序类对数组进行排序:

Sorting mySorting = new Sorting();
int SelectionSort = 1
System.out.println("\r\nSorting using selection sort:");
sortedArray = mySorting.SortIt(arr, SelectionSort);
for (int i = 0; i < arr.length; i++) {
System.out.println(sortedArray[i]);
}

如果有,这适用于 3 种排序类型并排序良好。

但问题是,如果我现在再进行一次排序,即使它仍然应该维护未排序的列表(或者至少我认为这是因为我正在更新该函数,而不是它本身)。arrsortedArrayarr

出于测试目的,如果我这样做:

Sorting mySorting = new Sorting();
int SelectionSort = 1
System.out.println("\r\nSorting using selection sort:");
sortedArray = mySorting.SortIt(arr, SelectionSort);
for (int i = 0; i < arr.length; i++) {
System.out.println(sortedArray[i]);
}

for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}

arr现在打印件也已排序。

我没有故意使用任何指针或记忆的东西,所以我不记得为什么会发生这种情况,我也不记得谷歌做什么。我发现我可以先将数组复制到未排序的数组中,然后在每次我想测试排序算法时将其复制回来,但我希望有人能为我指出正确的方向,以再次导致这种情况。

谢谢!

[已编辑以删除文件路径信息。

Java 数组

评论

3赞 Old Dog Programmer 11/14/2023
我可以建议编辑问题以显示一个完整但可重现性最小的示例吗?
1赞 Old Dog Programmer 11/14/2023
题外话:您可以使用 Arrays.toString 方法打印整个数组。这链接到采用 的 API 方法,但对于其他类型,它重载了。int
0赞 Old Dog Programmer 11/14/2023
这个问题在这里可能有也可能没有答案 stackoverflow.com/questions/12757841/...或这里 stackoverflow.com/questions/40480/......
2赞 experiment unit 1998X 11/14/2023
我当然希望你的 Sorting 类创建输入数组的副本,而不是直接对它进行操作
1赞 Abra 11/14/2023
我认为您需要发布类的代码.Sorting

答:

0赞 rzwitserloot 11/14/2023 #1

您的排序代码会修改(即破坏)输入。

Java 是按值传递的(即,每当您将值传递给方法时,都会传递一个副本),但是,一切都是引用。当你写:

int[] arr = new int[10];

这类似于“盖房子”,但不是房子——不,这只是地址簿中的一页。 不是说“ARR现在是房子”,不,意思是:把右边的东西的地址写在左边的通讯录页上。new int[10]int[] arr==

因此,当您调用 时,java 会适当地复制,但它正在复制通讯录页面。不是整个房子。SortIt(arr)

然后,你的排序方法遵循它得到的副本,将一块砖头扔进窗户,然后加速离开,这个小拖欠者。然后,您的主要方法稍后会转到并遵循其通讯簿页面。同一所房子,并注意到它已被破坏。

您有 4 个选项可以解决此问题:

  1. 让你的主代码做一个副本,并将副本交给你的排序方法。可以使用 制作副本。Arrays.copyOf(arr)
  2. 让您的排序方法复制它收到的任何错误。
  3. 让您的排序方法在不修改输入的情况下完成其工作。那是。。几乎将归结为选项 2,除非输入已经排序。
  4. 编写主代码,以便传递数组的方法修改它不再重要。

评论

0赞 hipposaver 11/14/2023
谢谢你的运行,是有道理的!:)现在我在调用 SortIt(arr) 之前使用 Array.copyOf。这是您通常通过方法处理传递数组的方式吗?