我是新的节目。我必须写一个代码,主要要求 - 用户选择的排序方法(其中一个已经加入时,第二个,我将在以后添加),进入阵列中元素的量,进入的元素,然后将代码排序。但它看起来像代码只需要最后输入的元素,并试图对其进行排序。我有什么做的,使其排序所有输入的元素吗?
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
您可以填写您的阵列检查内容后添加一个简单的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]);
}
你是以下的分选方法,在通过找到不小于那些元件的元件的其适当位置固定的一组相同的元素。
在寻找无少,等于元素的排序这就是问题所在。
equal[i]++;
代替equal[i]=i++;
同样的,
less[i]++;
代替less[i]=i++;
如果您使用的是Java 8或更近,你可以使用ArrayList类(与Integer类),而不是一个一维数组的(即int[] var = new int[x]
);这将允许你使用它的sort(Comparator)
方法来代替。
你将不得不创建一个Comparator实例(lambda表达式,或匿名)或实现类,除非你想使用其中的自然排序。
它会给你身边的那两个方针的东西:
ArrayList<Integer> var = new ArrayList<>();
和var.sort();
(假设你使用自然排序)
然而,这可能是很难在第一次操作,如果你是新来的Java集合框架,所以不要犹豫,问的问题。
P.S:我可能误解了代码,所以只是告诉我,这样我就可以解决我的答案。
P.S.S:有点不相干,而且它可能在你的心中(忽略的那部分的话),但我会建议你重构是为更小的方法/函数。
我认为你的代码的组织是非常糟糕的。它更容易给你更多的正确的解决方案,比数和解决您的问题:
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;
}
}