java不用数组数字排序_使用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 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 extractEven(int[] array) {

Map 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 list = new ArrayList();

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 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 predicate = e -> …使用Java DocumentListener的更智能方法 - java

目前,我在每个文本字段上都使用DocumentListener来实时验证用户的输入,但是我认为必须有一种更聪明的方法,因为我要重复很多次自我。有更聪明的方法吗?nameJTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void inse…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值