在Java 8中将数组转换为具有特定范围的列表
我想将一个字符串数组转换为具有特定范围的列表。在我的例子中,我总是希望从索引1到最后一个索引。我不需要列表中包含索引0值。是否有任何直接的方法,我可以使用过滤和转换为我需要的列表在Java 8中将数组转换为具有特定范围的列表,java,java-8,Java,Java 8,我想将一个字符串数组转换为具有特定范围的列表。在我的例子中,我总是希望从索引1到最后一个索引。我不需要列表中包含索引0值。是否有任何直接的方法,我可以使用过滤和转换为我需要的列表 public class test1 { public static void main(String[] args) { String[] optArr = {"start", "map1", "map2", "map3"}; List<String> list
public class test1 {
public static void main(String[] args) {
String[] optArr = {"start", "map1", "map2", "map3"};
List<String> list = Arrays.stream(optArr).collect(Collectors.toList());
System.out.println(list);
}
}
公共类test1{
公共静态void main(字符串[]args){
字符串[]optArr={“start”、“map1”、“map2”、“map3”};
List=Arrays.stream(optar.collect)(Collectors.toList());
系统输出打印项次(列表);
}
}
您可以使用:
List List=Arrays.stream(optar).skip(1).collect(Collectors.toList());
一个非Java 8选项可能是在当前列表的顶部创建一个视图,该视图省略了第一个元素:
List<String> list = Arrays.stream(optArr).collect(Collectors.toList());
List<String> viewList = list.subList(1, list.size());
List List=Arrays.stream(optar.collect)(Collectors.toList());
List viewList=List.subList(1,List.size());
这意味着,虽然底层数据结构仍然是原始列表,但内存中的一个额外元素似乎不是一个很大的惩罚。您也可以使用重载方法,如下所示:
List List=Arrays.stream(optar).skip(1).collect(Collectors.toList());
我想它一定有用
参见这里的文档:
< P>查看你的数据,你可以考虑:List<String> list = Stream.of(optArr).filter(s -> s.startsWith("map")).collect(toList());
List List=Stream.of(optar).filter(s->s.startsWith(“map”)).collect(toList());
但是,如果您只想筛选第一个索引子列表
,那么这是一个不错的选择。
您不需要在任何地方使用流。一种方法使用
List.sublist(int,int)
应该是这样的
List<String> al = new ArrayList<>(Arrays.asList(optArr));
List actualList = list.subList(1, al.size());
List al=newarraylist(Arrays.asList(optar));
List actualList=List.subList(1,al.size());
您还可以使用数组.copyOfRange
复制数组
将指定数组的指定范围复制到新数组中。范围(从)的初始索引必须介于零和original.length(包括)之间
IntStream:另一种方法是使用IntStream
List<String> list = Arrays.stream(optArr)
.skip(1)
.collect(Collectors.toList());
System.out.println(list);
List<String> result = IntStream.range(1, optArr.length).mapToObj(i->optArr[i]).collect(Collectors.toList());
List result=IntStream.range(1,optar.length).mapToObj(i->optar[i]).collect(Collectors.toList());
为什么需要使用流?为什么像for loop
s这样的古老魔法不足以完成这项任务
String[] optArr = {"start", "map1", "map2", "map3"};
final List<String> list = new ArrayList<>();
for (int i = 1; i < optArr.length; i++) // skip first element
list.add(optArr[i]);
String[]optArr={“start”、“map1”、“map2”、“map3”};
最终列表=新的ArrayList();
for(int i=1;i
作业最简单的工具。ArrayList类有一个方法,可以用来分割列表。旁白:重命名类/变量以遵循正确的命名约定,并具有有意义的名称。e、 g.
ArrayToListConversionTest
也是一个更好的名称。基本上,到目前为止,所有的答案(除了)都在浪费时间和空间。(字面意思——我的意思是,在网站上,以及在实施时)。假设有一个包含1000万个元素的列表,而您只想省略第一个元素。创建一个流并将其收集到一个新列表在时间和空间上都是O(n)。使用Arrays.asList(optArr).subList(1,optArr.length)
的答案是一个优雅、简洁的单行程序,在时间和空间上都有O(1)。@nullpointer-Um…我建议只运行原始流,然后根据需要查看它。为什么要用流创建一个新列表,而不仅仅是Arrays.asList(optArr)
?跳过的唯一挑战是选择初始元素,而不是skipping@nullpointer我认为我们都可以放心地同意,对于给定的用例,您的答案是最好的。向上投票。asList
+子列表
的优点是不必分配一个全新的列表。数组用作列表的备份存储,而不是复制。第一个可能就是解决方案。O(1)时间和空间,与这里的所有其他答案基本相反。
List<String> list = Arrays.asList(optArr).subList(1,optArr.length);
System.out.println(list);
List<String> list = Arrays.stream(optArr)
.skip(1)
.collect(Collectors.toList());
System.out.println(list);
List<String> al = new ArrayList<>(Arrays.asList(optArr));
List actualList = list.subList(1, al.size());
public static <T> T[] copyOfRange(T[] original, int from, int to)
List<String> result = Arrays.asList(Arrays.copyOfRange(optArr, 1, optArr.length));
List<String> result = IntStream.range(1, optArr.length).mapToObj(i->optArr[i]).collect(Collectors.toList());
String[] optArr = {"start", "map1", "map2", "map3"};
final List<String> list = new ArrayList<>();
for (int i = 1; i < optArr.length; i++) // skip first element
list.add(optArr[i]);