【问题标题】:I can't get my nested for loop to engage我无法让我的嵌套 for 循环参与
【发布时间】:2014-05-28 19:33:18
【问题描述】:

我正在尝试编写一个程序,该程序采用整数数组,扫描并删除任何重复值,然后将剩余值作为 ArrayList 返回。

就如何做而言,我觉得我走在正确的轨道上,但我似乎无法获得必要的嵌套 for 循环来参与。到目前为止,这是我的代码。

import java.util.ArrayList;

/**
 *
 * @author Justin
 */
public class ArrayOps4 {

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String [] args) {
        int [] cake = {2, 3, 4, 3, 2, 4, 5, 4, 6, 6, 6, 4, 3};
        System.out.println(copyArray(cake));
        // TODO code application logic here
    }

    /**
     *
     * @param anArray
     * @return
     */
    public static ArrayList copyArray(int [] anArray) {
        // your work here

        // declare the new ArrayList
        ArrayList<Integer> nal = new ArrayList<>();
        // loop through anArray, eliminating duplicates,
        int [] Array2;
        for (int i = 0 ; i < anArray.length ; i++) {
            for (int j = 1 ; j < anArray.length ; j++)
                if (anArray[j] == anArray[i]) {
                    for (int m = j ; m < anArray.length ; m++) {
                        anArray[m] = anArray[m++];
                    }
                }
        }

        for (int ii = 0 ; ii < anArray.length ; ii++) {
            nal.add(anArray[ii]);
        }

        // storing each unique element in the ArrayList

        // your work here

        // return new ArrayList
        return nal;
        // your work here
    }
}

其他一切似乎都工作正常,但第二个 for 循环应该循环遍历数组中的所有整数并将它们与第一个 for 循环所持有的位置进行比较,但不会参与。当我在 Netbeans 中调试它时,第一个 for 循环的变量只会增加自身,然后移动到 ArrayList 创建循环,效果很好。

我将非常感谢任何关于我做错了什么的意见,或者如果这个程序甚至会做我认为一旦它开始工作就会做的事情。

在考虑到每个人的有用建议后,我离我更近了,但我仍然卡住了。我修改后的代码仍然有两个输入字符串的问题,我就是不知道为什么

package arrayops4;

import java.util.ArrayList;

/**
 *
 * @author Justin
 */
public class ArrayOps4 {

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String [] args) {
        int [] cake = {2, 3, 4, 3, 2, 4, 6, 8, 9, 6, 11};
        System.out.println(copyArray(cake));
        // TODO code application logic here
    }

    /**
     *
     * @param anArray
     * @return
     */
    public static ArrayList copyArray(int [] anArray) {
        // your work here

        // declare the new ArrayList
        ArrayList<Integer> nal = new ArrayList<>();
        // loop through anArray, eliminating duplicates,
        int counter = 0;
        int length = anArray.length;

        for (int i = 0 ; i < anArray.length ; i++) {
            for (int b = i + 1 ; b < anArray.length ; b++) {

                if (anArray[i] == anArray[b]) {

                    for (int ii = b ; ii < anArray.length - 1 ; ii++) {
                        anArray[ii] = anArray[ii + 1];

                    }
                    counter++;
                }

            }

        }
        length = length - counter;
        for (int k = 0 ; k < anArray.length - 1 ; k++) {
            nal.add(anArray[k]);
        }
        return nal;
    }
}

**仍然给我带来麻烦的输入是 [2, 14, 9, 15, 9, 7, 3, 17, 14] 和 [3, 5, 5, 5, 3, 3, 5, 3 , 5]。第一组返回 [2, 14, 9, 15, 7, 3] 并且缺少 17。第二组返回空括号。任何进一步的帮助将不胜感激。 提前致谢。 **

【问题讨论】:

  • 你想在这里做什么:anArray[m] = anArray[m++]; ? (a)你搞乱了for 变量,mm++,并且(b)它基本上只是增加 m,因为首先发生分配,然后增加。所以数组不能改变,m 计数为 2。你确定你不想要像 anArray[m] = anArray[m + 1] 这样的东西吗?

标签: java arrays loops nested duplicates


【解决方案1】:

你的代码有两个问题:

for(int j=1;j<anArray.length;j++)

应该将j 初始化为i+1 以便从下一个元素开始,并且删除元素的代码也应该减少数组的有效长度(因为减少实际长度是不可能的)。您需要添加一个int 变量effectiveLength,最初将其初始化为anArray.length,并且每次从anArray 中删除一个元素时减一。

考虑改变你的算法,改用一种侵入性更小、速度更快的算法,这样就可以构建结果:

  • 对于anArray 的每个元素,检查它是否存在于nal
  • 为此,循环遍历nal 的所有元素,并将其与anArray[i] 进行比较
  • 如果没有找到匹配项,请将anArray[i] 添加到nal
  • 继续下一个元素。

【讨论】:

  • 感谢您的回复,我宁愿只循环遍历数组列表检查重复项,但这是一个家庭作业问题,它明确表示在转换为数组列表之前从数组中删除重复项。
【解决方案2】:

这是集合论的一个很好的应用。 Iterator 类使遍历集合和删除元素变得容易。

Integer[] cake= {2,3,4,3,2,4,5,4,6,6,6,4,3};
List<Integer> array = new ArrayList<Integer>();
Collections.addAll(array, cake);
HashSet<Integer> hash = new HashSet<Integer>();
Iterator<Integer> iter = array.iterator();

while(iter.hasNext())
{
    Integer val = iter.next();
    if (hash.contains(val))
    {
        iter.remove();
    }
    else
    {
        hash.add(val);
    }
}
System.out.println(array);

【讨论】:

  • 其实如果你不关心返回数字的顺序,那就更简单了……把它们都加到一个HashSet中,然后返回这个HashSet。
【解决方案3】:

您正在使用后增量:

           anArray[m] = anArray[m++]; 

这不会达到您的预期,而是将值复制到它已经存在的同一索引中。此外,您将 m 增加两次,因为 for 语句已经这样做了。

【讨论】:

  • 此外,我不认为您真的想更改 anArray 的内容。保持原样并让副本没有重复的想法不是吗?
【解决方案4】:

这里是它的要点。你在球场上。主要间距是为了引起对代码更改的注意。

   for(int i=0;i<anArray.length;i++)
   {
       for(int j=    i+1      ;j<anArray.length;j++)
       if(anArray[j] == anArray[i])
       {
        for(int m=j;m<anArray.length      - 1      ;m++)
        {
         anArray[m] = anArray[m      +1      ];   
        }
       }
   }

但您还必须记录将整个数组移向 [0] 的次数,以便打印输出循环仅打印移位后剩余的内容。否则输出为 2,3,4,5,6 [这应该是结尾],6,3,3,3,3,3,...

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    相关资源
    最近更新 更多