【问题标题】:modify an array list修改数组列表
【发布时间】:2014-01-31 20:49:19
【问题描述】:

我一直在努力修改传递给方法的数组列表。我只能修改该数组列表,而无需在该方法中创建任何新数组列表。

问题来了:

编写一个方法stutter,它将Strings 中的ArrayListinteger k 作为参数,并将每个字符串替换为该字符串的k 个副本。例如,如果列表在调用方法之前存储了值["how", "are", "you?"],并且k 为4,则它应该在方法执行完成后存储值["how", "how", "how", "how", "are", "are", "are", "are", "you?", "you?", "you?", "you?"]。如果 k 为 0 或负数,则调用后列表应为空。

一种创建新数组列表的方法:

public static void stutter(ArrayList<String> list, int k) {
     ArrayList<String> a = new ArrayList<String>();
     String s = "";
     if(k > 0) {
         for(int i = 0; i < list.size(); i++) {
             s = list.get(i);
             for(int j = 0; j < k; j++) {
                a.add(s);
             }
         }
     } 
}

在不创建新数组列表的情况下仅修改 ArrayList&lt;String&gt; list 的一种方法是什么?谢谢

【问题讨论】:

  • 嗯,打电话给list.add(...)
  • 在你的方法中使用list而不是a,但请注意这通常不是一个好主意,因为它可能会在以后引起问题,最好返回一个新的。
  • 请记住,您可能希望将 for 循环更改为 j &lt; k - 1,因为它已经包含一个 s 实例。订单重要吗?
  • 是的,我试过了,它给了我一个无限循环
  • 谢谢大家得到解决方案。

标签: java arrays list


【解决方案1】:
public static void addItem(List<String> list, int k){
    int size = list.size() * k;

    for (int i=0; i<size; i=i+k){
        String s = list.get(i);
        for (int j=0; j<k-1; j++){
            list.add(i+j, s);
        }
    }
}

【讨论】:

    【解决方案2】:

    您可以在进行迭代之前将ArrayList 的大小保存到一个变量中。

    int size = list.size();
    for(int i=0; i<k; i++){
        for(int j=0; j<size; j++){
            list.add(list.get(j));
        }
    }
    

    但是,对于您的示例,列表将变为 ["how","are","your","how","are","your","how","are","your","how","are","your"]。 如果您希望相同的值在一起:

    int size = list.size();
    for(int i=0;i<size;i++){
        String s = list.get(i*k);
        for(int j=0;j<k-1;j++){
            list.add(i*k+j, s);
        }
    }
    

    【讨论】:

      【解决方案3】:
      public static void addItem(List<String> list, int k) {
      
          int size = list.size();
      
          for (int i = 0; i < size * (k - 1); i++) {
              list.add("");
          }
      
          for (int i = size - 1; i >= 0; i--) {
              for (int m = k - 1; m >= 0; m--) {
                  list.set(k * i + m, list.get(i));
              }
          }
      
      }
      

      这种方法将维护两个指针,向后填充列表,不涉及任何移位。

      【讨论】:

        【解决方案4】:
        public static void stutter(ArrayList<String> arrayList, int k) {
            if (k > 0) {
            int index = 0;
            k = k - 1;
            for (int i = 0; i < arrayList.size(); i = i + (k + 1)) {
                for (int j = 0; j < k; j++) {
                    arrayList.add(index, arrayList.get(i));
                }
                index = index + (k + 1);
            }
        }
            else
            arrayList.clear(); 
        }
        

        输入:[how, are, you?], k=4

        输出:[how, how, how, how, are, are, are, are, you?, you?, you?, you?]

        【讨论】:

          【解决方案5】:
          public static void stutter(ArrayList<String> list, int k) {
              if (k <= 0) {
                  list.clear();
              }
              for (int i = list.size() - 1; i >= 0; i--) {
                  for (int r = 1; r < k; r++) {
                      list.add(i + 1, list.get(i));
                  }
              }
          }
          

          【讨论】:

          • 虽然这个代码块可能会回答这个问题,但如果你能提供一些解释为什么会这样,那将是最好的解释。
          • 首先,您要从基本情况开始,即当 k 小于或等于 0 时。如问题所述,如果发生这种情况,您希望返回一个空列表。从列表的末尾开始,您永远不会失去您在列表中的位置。将 k(exclusive) 字符串添加到列表中,完成后,您将转到下一个单词,直到您位于第一个索引处。如果有人有兴趣看到它,我也找到了一种 O(N) 的方法。
          猜你喜欢
          • 2023-04-03
          • 2019-03-26
          • 2019-05-23
          • 2018-08-29
          • 1970-01-01
          • 1970-01-01
          • 2014-06-22
          相关资源
          最近更新 更多