我正在学习Java 8流。告诉我,如何更紧凑地编写sortArray
方法?
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertArrayEquals;
public class TestStream {
/*
* Sort numbers in an array without changing even numbers position
*/
@Test
public void test_1() {
int[] nonSorted = new int[]{3, 4, 5, 2, 1, 6, 9, 8, 7, 0};
int[] expected = new int[]{1, 4, 3, 2, 5, 6, 7, 8, 9, 0};
Integer[] arr = sortArray(nonSorted);
int[] sorted = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
sorted[i] = arr[i];
}
assertArrayEquals(expected, sorted);
}
private Integer[] sortArray(int[] array) {
Map<Integer, Integer> even = extractEven(array);
Integer[] withoutEvens = removeEven(array);
int length = even.size() + withoutEvens.length;
Integer[] result = new Integer[length];
Arrays.sort(withoutEvens);
for (int i = 0; i < withoutEvens.length; i++) {
result[i] = withoutEvens[i];
}
even.forEach((k, v) -> {
System.arraycopy(result, k, result, k + 1, length - k - 1);
result[k] = v;
});
return result;
}
private Map<Integer, Integer> extractEven(int[] array) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
map.put(i, array[i]);
}
}
return map;
}
private Integer[] removeEven(int[] array) {
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 != 0) {
list.add(array[i]);
}
}
Integer[] a = new Integer[list.size()];
return list.toArray(a);
}
}
参考方案
可以想到一种解决方案,例如:
首先,我们从nonSorted[]
中提取奇数整数,并以排序的方式将它们放在stack
上。
为什么我们应该以排序的方式使用stack
?
最后的数组
需要按奇数Integers
排序,堆栈遵循FIFO(先入后出)
退出)政策。
现在我们获取一个Instream
并将其从0
运行到nonSorted.length-1
,并检查原始nonSorted
中是否存在奇数Integer
;一旦找到一个,我们就将其替换为堆栈的第一个元素,并从pop()
中对该元素进行stack
。
注意:并不是每次都需要在堆栈上玩
需要在堆栈中排序元素,但是在OP的情况下
是。
int[] nonSorted = new int[]{3, 4, 5, 2, 1, 6, 9, 8, 7, 0};
LinkedList<Integer> stack = Arrays.stream(nonSorted)
.sorted().filter(s -> s % 2 != 0).boxed()
.collect(Collectors.toCollection(LinkedList::new));
int[] expected = IntStream.rangeClosed(0, nonSorted.length - 1)
.map(s -> nonSorted[s] % 2 != 0 ? stack.pop():nonSorted[s])
.toArray();
使用Java RMI调用Python方法 - java我有一个通过Python web2py创建的远程方法。如何测试和调用Java中的方法?我能够测试该方法是否实现@service.xmlrpc,但是如何测试该方法是否实现@service.run? 参考方案 如果您能做到,我会感到惊讶。 Java RMI需要Java对等体。
使用Java 11编译后出现堆泄漏 - java将我们的Spring Web App Maven构建升级到Java 11之后,我们看到Java进程的内存消耗不断增加。工作正常:使用Java 8 JDK构建+在使用Java 11的服务器上运行有泄漏:使用Java 11构建+在使用Java 11的服务器上运行在堆转储甚至本机内存跟踪中都看不到该泄漏,该过程一直在增加,直到物理内存+交换已满并且该进程被系统杀死…
获取远程机器的系统信息(使用Java) - java正如问题的标题所言,我想使用Java获取远程系统的系统信息(例如OS名称,版本等)。但是,在任何人回答这个问题之前,我只想问一下这是否可能,如果可以,那么如何?还有一个问题是,这对于基于Unix和基于Windows的系统都应适用。我尝试搜索Internet,但是(几乎)空白。编辑:Java应用程序将是一个桌面应用程序,它必须具有凭据才能登录到远程系统,但不会…
使用Java 8流处理null属性,并使用lambda表达式进行排序 - java让我们考虑一个仅包含一个Parent属性的Integer类。我创建了6个父类对象,属性值是100, 20, 300, 400, 500, null。现在,我将所有对象添加到列表中(列表名称为list)。然后,我想获取其属性值大于100的对象。为此,我使用了Java 8流。Predicate<Entity> predicate = e -> …
使用Java DocumentListener的更智能方法 - java目前,我在每个文本字段上都使用DocumentListener来实时验证用户的输入,但是我认为必须有一种更聪明的方法,因为我要重复很多次自我。有更聪明的方法吗?nameJTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void inse…