【发布时间】:2020-06-01 08:21:17
【问题描述】:
我在用 Java 创建数组副本时遇到问题。
我将收到的数据的副本传递给我的自定义排序方法。
问题是原始数组也发生了变化。我试过.clone() 和我在互联网上找到的其他一些方法,但结果总是一样的:排序数组。我认为它特定于 java 行为,并且非常容易修复。可能带有静态关键字(?)的东西。通常我用 JS 编程,Java 不适合我:(
public static void mySort(Example[] data) {
Example[] copy = Arrays.copyOf(data, data.length);
Example[] sortedArray= customSort(copy);
System.out.println("Original data (should not be sorted): ");
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
}
如何在 mySort 方法中创建接收到的数据的真实副本?
所有代码:
package com.company;
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;
public class Main {
public static void main(String[] args) {
Example examples[] = new Example[20];
for (int i = 0; i < examples.length; i++) {
int randomValue1 = ThreadLocalRandom.current().nextInt(1, 6);
double randomValue2 = ThreadLocalRandom.current().nextDouble();
examples[i] = new Example(randomValue1, randomValue2);
}
System.out.println("Beforesort: ");
for (int i = 0; i < examples.length; i++) {
System.out.println(i + ". " + examples[i]);
}
mySort(examples);
}
public static void mySort(Example[] data) {
Example[] copy = Arrays.copyOf(data, data.length);
Example[] sortedArray= customSort(copy);
System.out.println("Original data (should not be sorted): ");
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
}
// you can ignore this, it's just customSort
static Example[] customSort(Example[] copy) {
for (int i = 0; i < copy.length; i++) {
for (int j = 0; j < copy.length - i - 1; j++)
if (copy[j].value1 != copy[j + 1].value1) {
if (copy[j].value1 > copy[j + 1].value1) {
int temp = copy[j].value1;
copy[j].value1 = copy[j + 1].value1;
copy[j + 1].value1 = temp;
}
} else {
if (copy[j].value2 > copy[j + 1].value2) {
double temp = copy[j].value2;
copy[j].value2 = copy[j + 1].value2;
copy[j + 1].value2 = temp;
}
}
}
return copy;
}
}
class Example {
int value1;
double value2;
public Example(int value1, double value2) {
this.value1 = value1;
this.value2 = value2;
}
@Override
public String toString() {
return "Example{" +
"value1=" + value1 +
", value2=" + value2 +
'}';
}
}
【问题讨论】:
-
看起来您实际上并没有将传递数组中
Example对象的顺序排序为customSort,而是通过更改Example对象的值来“排序”。你知道吗?你想要吗? -
@akuzminykh 我想将
data的副本传递给customSort方法。不应更改原始数组 (data)。 -
我知道,但这正是您正在做的事情。您通过在
Example实例之间交换value1字段的值来进行排序。这会影响实例本身,而不是传递数组中实例的位置。你明白问题了吗?你不是在改变元素的位置,而是在改变它们的内容。如果还不清楚,我可能需要写一个答案。 -
我懂一点。但我不知道该怎么做。如果您写下答案,我将非常感激