如何使用常规数组中的 keys/values 在 Java 8 中创建关联数组?
How to use keys/values from regular array to create associative array in Java 8?
我只是勉强学习 Java 并且需要在 Java 8 中完成一些事情,但我正在努力找出最有效的方法(来自 PHP 背景)。本质上,我试图给它一个常规数组,运行 一些计算,然后将其中一些值保存在保留原始键的新数组中。
所以基本上原始数组是这样的:
0 => 3
1 => 5
2 => 6
3 => 8
并且新数组将是一个关联数组,其中的键是专门分配的,如:
1 => 5
3 => 8
为了帮助自己在我更熟悉的事物中形象化它,我在 PHP 中得到了我需要的一切,它看起来像这样:
$array = array( 8, 3, 2, 9, 1, 15 );
$new_array = array();
foreach ( $array as $key => $value ) {
// Calculate something and build new array, for example...
if ( 5 > $value ) {
$new_value = $value + 5;
$new_array[ $key ] = $new_value;
}
}
所以在这个例子中,$new_array
将是:
1 => 8
2 => 7
4 => 6
我发誓我见过一些东西,我可以做一个基本的 for
循环并访问 key
和 value
但我找不到我在哪里读到的,以及我现在发现的所有其他内容都在谈论使用 forEach()
遍历“哈希映射”,所以这似乎是标准方法,但是当我尝试 array.forEach((k, v) -> // Calculations....
时它告诉我它“找不到符号”对于 array
在该上下文中,它被立即设置为 int[] array = { // numbers }
。据我了解,我必须将数组转换为哈希映射才能在 foreach 中使用 key/value 对,但显然我在那里也做错了......
所以我想这是我的问题...
- 我可以为此使用基本的
for
循环,还是我需要将数组转换为散列映射才能访问 key/value 对?如何?我不需要使用任何特定的方法,只是寻找最有效的方法。
- 由于其他原因我有
import java.util.Arrays;
- 我需要导入其他东西吗?
感谢您的帮助。
更新------------------------
澄清一下,稍后我需要再次使用 $new_array
作为源在代码中做类似的事情,所以我需要能够获取密钥而不仅仅是迭代计数。
例如,如果我将 foreach
包装在 while
循环中,第一次以 $array
开始,随后每次设置 $array
作为$new_array
到运行再次计算。
所以换句话说,我不能依靠迭代计数来匹配键。
您可以使用常规 for
循环:
int [] array = {8, 3, 2, 9, 1, 15};
Map<Integer, Integer> map = new HashMap<>();
// Print the results
for (int i = 0; i < array.length; i++) {
if (5 > array[i]) {
map.put(i, array[i] + 5);
}
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=>" + entry.getValue());
}
可以使用 Stream API 以函数方式将数组转换为映射:
- 使用
IntStream.range
创建整数流
- 使用
Collectors.toMap
收集到地图中:
对于新地图,filter
操作可以应用于 select 小于 5 的值。
// these imports to be added
import java.util.*;
import java.util.stream.*;
int [] array = {8, 3, 2, 9, 1, 15};
Map<Integer, Integer> map = IntStream.range(0, array.length) // stream of int indexes
.boxed() // stream of Integer
.collect(Collectors.toMap(
i -> i, // use index as key
i -> array[i] // get array element as value
));
Map<Integer, Integer> mapNew = IntStream.range(0, array.length)
.boxed()
.filter(i -> array[i] < 5)
.collect(Collectors.toMap(i -> i, i -> array[i] + 5));
System.out.println("old map:" + map);
// printing each entry in new map using lambda
mapNew.forEach((k, v) -> System.out.println(k + " -> " + v));
// use common for loop by entries
System.out.println("----");
for(Map.Entry<Integer, Integer> entry : mapNew.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
输出:
old map:{0=8, 1=3, 2=2, 3=9, 4=1, 5=15}
1 -> 8
2 -> 7
4 -> 6
----
1 => 8
2 => 7
4 => 6
我只是勉强学习 Java 并且需要在 Java 8 中完成一些事情,但我正在努力找出最有效的方法(来自 PHP 背景)。本质上,我试图给它一个常规数组,运行 一些计算,然后将其中一些值保存在保留原始键的新数组中。
所以基本上原始数组是这样的:
0 => 3
1 => 5
2 => 6
3 => 8
并且新数组将是一个关联数组,其中的键是专门分配的,如:
1 => 5
3 => 8
为了帮助自己在我更熟悉的事物中形象化它,我在 PHP 中得到了我需要的一切,它看起来像这样:
$array = array( 8, 3, 2, 9, 1, 15 );
$new_array = array();
foreach ( $array as $key => $value ) {
// Calculate something and build new array, for example...
if ( 5 > $value ) {
$new_value = $value + 5;
$new_array[ $key ] = $new_value;
}
}
所以在这个例子中,$new_array
将是:
1 => 8
2 => 7
4 => 6
我发誓我见过一些东西,我可以做一个基本的 for
循环并访问 key
和 value
但我找不到我在哪里读到的,以及我现在发现的所有其他内容都在谈论使用 forEach()
遍历“哈希映射”,所以这似乎是标准方法,但是当我尝试 array.forEach((k, v) -> // Calculations....
时它告诉我它“找不到符号”对于 array
在该上下文中,它被立即设置为 int[] array = { // numbers }
。据我了解,我必须将数组转换为哈希映射才能在 foreach 中使用 key/value 对,但显然我在那里也做错了......
所以我想这是我的问题...
- 我可以为此使用基本的
for
循环,还是我需要将数组转换为散列映射才能访问 key/value 对?如何?我不需要使用任何特定的方法,只是寻找最有效的方法。 - 由于其他原因我有
import java.util.Arrays;
- 我需要导入其他东西吗?
感谢您的帮助。
更新------------------------
澄清一下,稍后我需要再次使用 $new_array
作为源在代码中做类似的事情,所以我需要能够获取密钥而不仅仅是迭代计数。
例如,如果我将 foreach
包装在 while
循环中,第一次以 $array
开始,随后每次设置 $array
作为$new_array
到运行再次计算。
所以换句话说,我不能依靠迭代计数来匹配键。
您可以使用常规 for
循环:
int [] array = {8, 3, 2, 9, 1, 15};
Map<Integer, Integer> map = new HashMap<>();
// Print the results
for (int i = 0; i < array.length; i++) {
if (5 > array[i]) {
map.put(i, array[i] + 5);
}
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=>" + entry.getValue());
}
可以使用 Stream API 以函数方式将数组转换为映射:
- 使用
IntStream.range
创建整数流 - 使用
Collectors.toMap
收集到地图中:
对于新地图,filter
操作可以应用于 select 小于 5 的值。
// these imports to be added
import java.util.*;
import java.util.stream.*;
int [] array = {8, 3, 2, 9, 1, 15};
Map<Integer, Integer> map = IntStream.range(0, array.length) // stream of int indexes
.boxed() // stream of Integer
.collect(Collectors.toMap(
i -> i, // use index as key
i -> array[i] // get array element as value
));
Map<Integer, Integer> mapNew = IntStream.range(0, array.length)
.boxed()
.filter(i -> array[i] < 5)
.collect(Collectors.toMap(i -> i, i -> array[i] + 5));
System.out.println("old map:" + map);
// printing each entry in new map using lambda
mapNew.forEach((k, v) -> System.out.println(k + " -> " + v));
// use common for loop by entries
System.out.println("----");
for(Map.Entry<Integer, Integer> entry : mapNew.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
输出:
old map:{0=8, 1=3, 2=2, 3=9, 4=1, 5=15}
1 -> 8
2 -> 7
4 -> 6
----
1 => 8
2 => 7
4 => 6