使用Java-8对数组中的数字排序而不更改偶数位置 - java

我正在学习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…