代码之家  ›  专栏  ›  技术社区  ›  user63898

Java如何在变量数组的开始添加插入元素?

  •  2
  • user63898  · 技术社区  · 7 年前

    我有一个带有字符串列表参数的函数,我想在这个字符串列表参数的开头插入元素,这样我就可以将它作为参数传递给其他函数,现在当我尝试使用adding arraylist时,argarr没有这样的方法。

    ArrayList.add(0,"foo");
    
    
    private void A(String... argsArr)
    {
       //insert element at beginning
       B(argArr); 
    }
    private void B(String... argsArr)
    {
    }
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Andy Thomas    7 年前

    如果要使用变量参数数组,可以创建插入元素的新数组。例如,使用流:

    private void a(String... argsArr) {
        String[] args2 = Stream.concat(Stream.of("foo"), Arrays.stream(args))
                               .toArray(String[]::new);
        b( args2 );
    }
    

    如果愿意,可以创建一个没有流的新数组。下面是一个使用临时列表的简单方法。

    private void a(String... argsArr) {
        List<String> newList = new ArrayList<>();
        newList.add("foo");
        newList.addAll(Arrays.asList(argsArr));
    
        b(newList.toArray(new String[newList.size()]));
    }
    

    如果不需要变量参数数组,可以使用列表参数。将新元素插入到不同的列表中是一种很好的形式。调用方可能提供不可修改的列表,或者可能不希望修改其列表。

    private void a2( List<String> args ) {
    
        List<String> newList = new ArrayList<>( args );
        newList.add(0, "foo"); // <-- Extra O(n) time to shift elements over.
    
        b( newList );
    }
    

    通过不在现有列表的开头插入常量因子,可以提高效率。

    private void a2( List<String> args ) {
    
        List<String> newList = new ArrayList<>( );
        newList.add("foo"); 
        newList.addAll( args );
    
        b( newList );
    }
    
        2
  •  1
  •   Sahil Chhabra    7 年前

    String... 是可变长度数组, ArrayList 因此 add(index,element) 在您的 argsArr 帕拉姆

    你需要写一些逻辑来实现你想要的。下面列出了一种可能性:

    private void A(String... argsArr){
       List<String> list = Arrays.stream(argsArr).collect(Collectors.toList());
       list.add(0,"New_Element_To_Be_Added");
       B(list.toArray(new String[list.size()]));
    }
    
        3
  •  1
  •   Sam Orozco    7 年前

    只需将数组复制到更大的数组并设置第0个索引:

    int[] second = new int[args.length + 1];
    System.arraycopy(args, 0, second, 1, args.length);
    second[0] = val;
    

    自从 varargs 是一个数组。