【问题标题】:add data after every 2nd element in an array在数组中的每个第二个元素之后添加数据
【发布时间】:2020-12-09 21:22:20
【问题描述】:

我想在每个第二个元素之后在数组中添加对象/数据......为了更清楚,我将使用一个简单的示例

我有数组列表:

List<Object> list = new ArrayList<>();
list.add("messi");
list.add("ronaldo");
list.add("rooney");
list.add("pogba");
list.add("hazard");

print(list);
//output : [messi,  ronaldo, rooney, pogba,hazard]

我想要的是:

//[messi,  ronaldo, DATA, rooney, pogba, DATA, hazard]

我怎样才能做到这一点。

在每个第二个元素之后在数组中添加数据。

【问题讨论】:

  • 是什么阻止您调用 add(index, value) 在索引 2、5、8、11...处添加值?
  • @Andreas 如果我直接尝试添加list.add(2,"Data");,则会抛出错误Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
  • @SagarGangwal 不要在空列表上这样做。见my answer
  • @Andreas,是的,看过了。
  • @SagarGangwal 由于您显然没有获得自己代码的上下文,因此我已将您的代码添加到 answer

标签: java list algorithm arraylist data-structures


【解决方案1】:

通过维护一个计数器。

public class Main {
    public static void main(String[] args) {
        
        List<Object> list = new ArrayList<>();
        list.add("messi");
        list.add("ronaldo");
        list.add("rooney");
        list.add("pogba");
        list.add("hazard");

        int counter = 0 ;
        List<Object> data = new ArrayList<>();
        for(Object obj : list){
            data.add(obj);
            counter = counter + 1;
            if(counter%2 == 0)
                data.add("DATA");
        } 
        
        for(Object obj : data)
            System.out.println(obj);
    }
}

【讨论】:

    【解决方案2】:
    class sample {
        public static void main(String[] args) {
            List<Object> list = new ArrayList<>();
            sample.addList("messi", list);
            sample.addList("ronaldo", list);
            sample.addList("rooney", list);
            sample.addList("pogba", list);
            sample.addList("hazard", list);
            System.out.println(list);
        }
    
        private static void addList(String value, List<Object> objects) {
              if (!objects.isEmpty() && (objects.size() % 3 == 2)) {
                objects.add("Data");
            }
            objects.add(value);
    
        }
    }
    

    您可以创建一种如上所述的实用程序方法。 每次在添加元素之前检查是否 list.size() % 3 == 2 然后添加额外的元素。

    这会对你有所帮助。

    【讨论】:

    • 你的输出是[messi, ronaldo, Data, rooney, Data, pogba, Data, hazard]
    • 您正在将“数据”添加到您考虑被 2 整除的长度的同一列表中。
    【解决方案3】:

    所以,你可以做的是创建一个新列表来存储旧数据和新对象:

    List<Object> list = new ArrayList<>();
    List<Object> newlist = new ArrayList<>();
    
    list.add("messi");
    list.add("ronaldo");
    list.add("rooney");
    list.add("pogba");
    list.add("hazard");
    
    for(int i = 0; i < list.size(); i++) {
       if(i%2==0) {
           // Add DATA after 2 items
           newlist.add(data);
        }
        newlist.add(list.get(i));
     }
    

    由于我是用手机写的,请有人格式化。

    【讨论】:

    • newlist 变为 [messi, DATA, ronaldo, rooney, DATA, pogba, hazard, DATA]
    【解决方案4】:

    查看所需的输出和插入的 DATA 值的索引:

    [messi, ronaldo, DATA, rooney, pogba, DATA, hazard]
       0        1      2      3      4      5      6
    

    DATA 值进入索引 2、5、8、11,...

    这意味着这是一个简单的for循环调用add(int index, E element)

    List<Object> list = new ArrayList<>();
    list.add("messi");
    list.add("ronaldo");
    list.add("rooney");
    list.add("pogba");
    list.add("hazard");
    System.out.println(list);
    
    for (int i = 2; i < list.size(); i += 3) {
        list.add(i, "DATA");
    }
    System.out.println(list);
    

    输出

    [messi, ronaldo, rooney, pogba, hazard]
    [messi, ronaldo, DATA, rooney, pogba, DATA, hazard]
    

    【讨论】:

    • 如果您在此处看到 baeldung.com/java-collections-complexity ,则您选择的方法的时间复杂度平均运行时间为 O(n) 时间,其中 add() 具有 takes O(1) time
    • @SagarGangwal 这与提出的问题有什么关系?
    • 你已经足够成熟,可以用优化的方法回答。
    • @SagarGangwal 问题是如何“在数组中每个第二个元素之后添加对象/数据”。这就是您对其中包含数据的现有数组列表执行此操作的方式,即这是对问题的直接、准确的回答。
    • 这是你的意见。但优化的应该是使用O(1) 时间复杂度方法而不是O(n) 添加一个元素。
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2021-09-24
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2022-01-05
    相关资源
    最近更新 更多