【问题标题】:Storing data in an array and pushing items down with a for-loop将数据存储在数组中并使用 for 循环下推项目
【发布时间】:2013-11-26 07:19:00
【问题描述】:

我不确定如何使此方法将项目向下推送而不是覆盖它们。现在,如果我有一个包含 10 个项目的数组:

[0] = zero
[1] = one
[2] = two
...
[10] = ten 

我在索引 [2] 处插入一个项目,发生的情况如下:

[0] = zero
[1] = one
[2] = two
[3] = two
[4] = two
 ...  
[10] = two 

它会覆盖所选索引之后的所有项目,而不是按索引将它们下推。为什么会发生这种情况,我该如何解决?谢谢。

public void insert(int i, String s) {

if (array[i] == null) {
    array[i] = s;spot on the list.
} else { 
    for (int j = i; j < array.length - 1; j++) {
        array[j + 1] = array[j]; 

        if (j == array.length - 1) { 
            break;
        } 
    }
    array[i] = s;
    extendArray();

【问题讨论】:

  • 尝试调试它。它将帮助您更轻松地学习 java...
  • 您意识到在 Java 中数组不会自动调整大小,因此如果您的程序曾经进入 if (array[i] == null) {array[i] = s;},那么您的程序将会崩溃。您必须创建一个增加大小的新数组。

标签: java arrays for-loop store


【解决方案1】:

你可以改变for循环条件

来自

for (int j = i; j < array.length - 1; j++) {

            array[j + 1] = array[j]; 

for(int j=array.length-2;j>=i;j--){

            array[j + 1] = array[j];

通过此更改,控制台中将显示以下信息:

[zero, one, two, two, three, four, five, six, seven, eight, nine]

【讨论】:

    【解决方案2】:

    您正在推送更改后的索引。

    "数组[j + 1] = 数组[j];" 在您更改了 array[j] 之后(在 for 循环的开头将 == 更改为 array[i])。

    但是看看这个:

    ar = [1,2,3]

    插入位置 1 意味着我将设置 ar[2]=ar[1]。

    怎么做?拉而不是推。使循环从 array.length-1 下降到要更改的索引。

    //check if you need to grow the array first.
    for (int j = array.length-1; j > i; j--) {
        array[j] = array[j-1]; 
    }
    //and now insert.
    

    【讨论】:

      【解决方案3】:

      如果您想“推送”项目而不是“覆盖”它们,那么您不应该使用数组,使用ArrayList 会更容易:

      List<Integer> lst = new ArrayList<Integer>();
      lst.add(1);
      lst.add(3);
      lst.add(4);
      lst.add(1, 2); // "push" the elements to the right, making room for 2
      

      在上面的例子中,最后lst 将包含1, 2, 3, 4

      【讨论】:

      • 问题是关于算法,所以......使用使算法无用的数据结构没有多大意义。此外,您认为 ArrayList 在内部做了什么?
      • @iajrz 在任何实际生产系统中,你永远不会自己编写这个算法。
      • @iajrz 准确地说,如果 ArrayList 在引擎盖下完全一样,为什么要重新发明轮子?
      • 没有暗示。 OP也没有。问题是“我不确定如何使 此方法 将项目向下推送而不是覆盖它们。”。但没关系...我只是希望你能回答问题顾问,而不仅仅是顾问。
      • @ÓscarLópez:你的意思是说你从来没有写过排序算法?还是搜索算法?还是树平衡算法?这样做是有原因的:学习!
      【解决方案4】:

      问题在于你的替换:

       array[j + 1] = array[j]; 
      

      举个例子:如果您使用的是j = 0,那么您将array[1] 替换为array[0] 中的值 然后在循环的下一步中,将 array[2] 的值替换为 array[1] 的值,而 array[0] 的值已替换为 array[0] 的值。

      您应该从末尾开始处理您的数组(将 jarray.length 减少到 j=i),您应该没问题。

      【讨论】:

      • 正是我要说的! +1
      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2022-08-03
      • 2019-10-18
      • 1970-01-01
      • 2012-02-18
      • 2019-07-05
      • 2017-09-08
      相关资源
      最近更新 更多