我无法让我的嵌套for循环参与进来

时间:2014-04-14 17:56:05

标签: java arrays loops nested duplicates

我正在尝试编写一个程序,它接受一个整数数组,扫描并删除任何重复的值,然后将剩余的值作为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.第二组返回空括号。真的很感激任何进一步的帮助。 提前致谢。 **

4 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

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

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

考虑改变你的算法,转而采用性能较低且速度较快的算法来构建结果:

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

答案 1 :(得分:1)

这是集合论的一个很好的应用。 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);

答案 2 :(得分:0)

您正在使用postincrement:

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

这不会按预期执行,而是将值复制到它已驻留的同一索引中。此外,您将增加m两次,因为for语句已经执行此操作。

答案 3 :(得分:0)

这是它的要点。你在球场。主要间距是提醒您注意代码的更改。

   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,......