我想在一行中只列出正数而在一行中只列出负数,但它们只用文本逐一显示。 这是我的代码:
int[] array = {2, -5, 4, 12, 54, -2, -50, 150};
Arrays.sort(array);
for (int i = 0; i < array.length; i++) {
if (array[i] < 0) {
System.out.println("Less than 0: " + array[i]);
} else if (array[i] > 0) {
System.out.println("Greater than 0: " + array[i]);
}
}
答案 0 :(得分:6)
您当前正在为每个元素打印一行(以及是否小于0或大于0),而是使用IntStream
和filter()
来表示所需元素(并收集) Collectors.joining()
)的人。像,
int[] array = { 2, -5, 4, 12, 54, -2, -50, 150 };
Arrays.sort(array);
System.out.println("Less than 0: " + IntStream.of(array) //
.filter(x -> x < 0).mapToObj(String::valueOf).collect(Collectors.joining(", ")));
System.out.println("Greater than 0: " + IntStream.of(array) //
.filter(x -> x > 0).mapToObj(String::valueOf).collect(Collectors.joining(", ")));
输出
Less than 0: -50, -5, -2
Greater than 0: 2, 4, 12, 54, 150
你可以用一对StringJoiner
(s)和for-each
循环以及(仅仅因为)格式化的io来获得相同的结果。像,
int[] array = { 2, -5, 4, 12, 54, -2, -50, 150 };
Arrays.sort(array);
StringJoiner sjLess = new StringJoiner(", ");
StringJoiner sjGreater = new StringJoiner(", ");
for (int x : array) {
if (x < 0) {
sjLess.add(String.valueOf(x));
} else if (x > 0) {
sjGreater.add(String.valueOf(x));
}
}
System.out.printf("Less than 0: %s%n", sjLess.toString());
System.out.printf("Greater than 0: %s%n", sjGreater.toString());
答案 1 :(得分:4)
由于您对值进行了排序,因此您知道所有负值都在正值之前,因此您开始打印值,然后在遇到第一个正值时切换到新行。
E.g。如下所示,它也可以处理所有负值的数组,所有正值的数组,甚至是一个空数组。
这只使用你已经知道的Java结构。
int[] array = {2, -5, 4, 12, 54, -2, -50, 150};
Arrays.sort(array);
for (int i = 0, iFirstPositive = 0; i < array.length; i++) {
if (array[i] < 0)
iFirstPositive = i + 1; // Assume index of first positive value is next
if (i == iFirstPositive) {
if (i != 0)
System.out.println(); // End line of negative values
System.out.print("Greater than 0: "); // Start line of positive values
} else if (i == 0) {
System.out.print("Less than 0: "); // Start line of negative values
} else {
System.out.print(", ");
}
System.out.print(array[i]);
}
if (array.length != 0) {
System.out.println(); // End line if anything printed
}
输出
Less than 0: -50, -5, -2
Greater than 0: 2, 4, 12, 54, 150
更简单,但稍微不那么优化,你也可以用两个循环来做:
int[] array = {2, -5, 4, 12, 54, -2, -50, 150};
Arrays.sort(array);
System.out.print("Less than 0:");
for (int i = 0; i < array.length; i++) {
if (array[i] < 0) {
System.out.print(" " + array[i]);
}
}
System.out.println();
System.out.print("Greater than 0:");
for (int i = 0; i < array.length; i++) {
if (array[i] > 0) {
System.out.print(" " + array[i]);
}
}
System.out.println();
输出
Less than 0: -50 -5 -2
Greater than 0: 2 4 12 54 150
答案 2 :(得分:3)
做这样的事情:
Arrays.sort(array);
String negative = "Less than 0: ";
String positive = "Greater than 0: ";
for (int i = 0; i < array.length; i++) {
if (array[i] < 0) {
negative.concat(array[i] + ",");
}
else (array[i] > 0) {
positive.concat(array[i] + ",");
}
}
System.out.println(positive);
System.out.println(negative);
将值存储在字符串中,然后在for循环后打印它们。
答案 3 :(得分:2)
我尝试尽可能少地更改您的代码。
int[] array = { 2, -5, 4, 12, 54, -2, -50, 150 };
Arrays.sort(array);
boolean firstHalf = true;
System.out.print("Less than 0: ");
for (int i = 0; i < array.length; i++) {
if (array[i] < 0) {
System.out.print(array[i] + " ");
} else if (array[i] > 0) {
if (firstHalf){
System.out.print("\nGreater than 0: ");
firstHalf = false;
}
System.out.print(array[i] + " ");
}
}
答案 4 :(得分:2)
这是流的完美用例:
System.out.println(Arrays.stream(array).filter(n -> n < 0).collect(Collectors.toList()));
答案 5 :(得分:0)
我认为使用partitioningBy
(在java 8中引入)正是出于这种情况。你也不需要对数组进行排序。
Map<Boolean,List<Integer>> map = IntStream.range(0,array.length)
.mapToObj(i->array[i])
.collect(Collectors.partitioningBy(a->a>0));
打印正数
map.get(true).forEach(integer -> System.out.print(integer+","));
打印负数
map.get(false).forEach(integer -> System.out.print(integer+","));
如果你想对它进行排序,你可以像下面那样进行排序。
map.get(false).stream().sorted()....