我是编程新手。我必须编写一个代码,主要要求-用户选择排序方法(一种已经添加,第二种我以后将添加),输入数组中元素的数量,输入元素,然后代码对它们进行排序。但是看起来代码只接受最后输入的元素并尝试对其进行排序。我该怎么做才能对所有输入的元素进行排序?
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("181RDB094 Līva Gundega Ermansone 1");
System.out.print("method:");
int M;
if (sc.hasNextInt())
M = sc.nextInt();
else {
System.out.println("input-output error");
sc.close();
return;
}
System.out.print("count:");
int count = sc.nextInt();
int[] masīvs = new int[count];
System.out.println("items:");
masīvs = new int[count];
for (int i = 0; i < count; i++) {
masīvs[i] = sc.nextInt();
}
System.out.println("result:");
if (M == 1) {
int[] b = new int[count];
int[] less = new int[count];
int[] equal = new int[count];
int k;
for (int i = 0; i < count; i++)
for (int j = 0; j < count; j++) {
if (masīvs[i] == masīvs[j]) {
equal[i] = i++;
} else if (masīvs[i] > masīvs[j]) {
less[i] = i++;
}
}
for (int i = 0; i < count; i++) {
k = less[i];
for (int j = 0; j < equal[i]; j++) {
b[k + j] = masīvs[i];
}
}
for (int i = 0; i < count; i++) {
masīvs[i] = b[i];
System.out.print(masīvs[i] + " ");
}
} else if (M == 2) {
} else {
System.out.println("input-output error");
return;
}
}
抱歉,代码很丑陋,只是草稿。
预期:
181RDB094 Līva Gundega Ermansone 1
method:1
count:4
items:
13
31
55
2
result:
55 31 13 2
实际结果:
181RDB094 Līva Gundega Ermansone 1
method:1
count:4
items:
13
31
55
2
result:
2 2 2 0
答案 0 :(得分:1)
您可以在填充数组以检查内容之后添加一个简单的for循环。在那里,您可以看到所有条目均已正确写入阵列。
这将输出:
Array:13
Array:31
Array:55
Array:2
for (int i = 0; i < masīvs.length; i++) {
System.out.println("Array:" + masīvs[i]);
}
答案 1 :(得分:1)
您要使用的排序方法是通过找到不大于这些元素的元素来将一组相等的元素固定在它们的适当位置。
排序中的问题在于找到小于等于的元素编号。
equal[i]++;
而不是equal[i]=i++;
类似地,
less[i]++;
而不是less[i]=i++;
答案 2 :(得分:0)
如果您使用的是 Java 8 或更新的版本,则可以使用ArrayList类(与Integer类一起使用)代替一维数组(即int[] var = new int[x]
);它将允许您改用其sort(Comparator)
方法。
除非您要使用自然实例的顺序,否则必须创建一个Comparator实例(lambda函数或匿名实例)或实现类。
这将为您提供围绕这两行的信息:
ArrayList<Integer> var = new ArrayList<>();
和var.sort();
(假设您使用自然顺序)
但是,如果您是 Java Collection Framework 的新手,一开始可能会更难操作,所以请随时提出问题。
P.S .:我可能对代码有误解,所以请告诉我,以便解决问题。
P.S.S .:有点不相关,可能在您的脑海中(然后忽略该部分),但是我建议您将其重构为更多更小的方法/函数。
答案 3 :(得分:0)
我认为您的代码组织非常糟糕。为您提供更正确的解决方案比计算和解决问题要容易得多:
public class Foo {
public static void main(String... args) {
final BiFunction<int[], Comparator<Integer>, int[]> sort =
(items, comparator) -> Arrays.stream(items)
.boxed()
.sorted(comparator)
.mapToInt(i -> i)
.toArray();
try (Scanner scan = new Scanner(System.in)) {
Comparator<Integer> comparator = getSortingMethod(scan);
int[] items = getItems(scan);
int[] sorted = sort.apply(items, comparator);
System.out.println(Arrays.toString(sorted));
}
}
private static final Comparator<Integer> SORT_ASC = Comparator.naturalOrder();
private static final Comparator<Integer> SORT_DESC = Comparator.reverseOrder();
private static final Comparator<Integer> SORT_NULL = (one, two) -> {
throw new IllegalArgumentException("input-output error");
};
private static Comparator<Integer> getSortingMethod(Scanner scan) {
System.out.println("181RDB094 Līva Gundega Ermansone 1");
System.out.print("method:");
try {
int M = scan.nextInt();
if (M == 1)
return SORT_DESC;
if (M == 2)
return SORT_ASC;
return SORT_NULL;
} catch(RuntimeException e) {
return SORT_NULL;
}
}
private static int[] getItems(Scanner scan) {
System.out.print("count:");
int[] items = new int[scan.nextInt()];
System.out.println("items:");
for (int i = 0; i < items.length; i++)
items[i] = scan.nextInt();
return items;
}
}