java - 从2个for循环中的java中的2个ArrayList中删除元素

标签 java arrays algorithm arraylist iterator

有N个男孩和N个女孩。只有男孩和女孩可以组成一对舞(即不允许同性舞对)。配对的唯一其他条件是它们的绝对高度差应小于或等于 K。

找出可以组成的最大对数,使每个人都有一个独特的伙伴。

输入格式 第一行将包含两个整数,N 和 K。 第二行将包含 N 个整数,即 N 个男孩的高度。 第三行将包含 N 个整数,即 N 个女孩的高度。

约束条件 1≤N≤105 1≤K≤109 1≤男生或女生高度≤109

输出格式 包含最大可能对数的单行。

我的问题是在满足条件后从两个数组中删除元素。 (存储 2 个数组后)

我使用的第一个算法:

Arrays.sort(ArrBoys);
    Arrays.sort(ArrGirls);
    double count = 0;
    for (int i = 0; i < ArrGirls.length; i++) {
        for (int j = 0; j < ArrBoys.length; j++) {
            if ((int) Math.abs(ArrBoys[j] - ArrGirls[i]) <= k) {
                ArrBoys[j] = 0;
                ArrGirls[i] = 0;
                count++;
                break;
            }
        }
    }
    System.out.println((int) count);

这绝对是错误的,因为我们需要删除那些元素而不是让它们为零,所以我意识到我需要将它们转换为 ArrayLists。 然后我带来了这段代码:

double count = 0;
    int dif = 0;
    for (Integer ArrGirl : ArrGirls) {
        loop1:
        {
            for (Integer ArrBoy : ArrBoys) {
                dif = (int) Math.abs(ArrBoy - ArrGirl);
                if (dif <= k) {
                    System.out.println("we took " + ArrBoy + " from boys with "
                    + ArrGirl + " from girls, thier dif is " + dif);
                    ArrBoys.remove(ArrBoy);
                    ArrGirls.remove(ArrGirl);
                    count++;
                    break loop1;
                }
            }
        }
    }
    System.out.println((int) count);

使用这个算法给我一个像这样的异常:

线程“main”中的异常 java.util.ConcurrentModificationException 在 java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 在 java.util.ArrayList$Itr.next(ArrayList.java:851)

在我搜索了这个异常之后,我发现我应该在使用 remove 方法时使用迭代器,然后我使用了这段代码:

double count = 0;
    int dif = 0;
    Iterator<Integer> iteB = ArrGirls.iterator();
    Iterator<Integer> iteG = ArrGirls.iterator();
    while (iteG.hasNext()) {
        int value2 = iteG.next();
        while (iteB.hasNext()) {
            int value = iteB.next();
            dif = (int) Math.abs(value - value2);
            if (dif <= k) {
                System.out.println("we took " + value + " from boys with " + value2
                        + " from girls, thier dif is " + dif);
                count++;
                iteB.remove();
                iteG.remove();

            }
        }
    }
    System.out.println((int) count);

这段代码给了我错误的信息,也给了我同样的异常。

这是我第一次使用 ArrayList,你有什么想法可以更正这段代码吗?

最佳答案

你每次都必须为女孩重新分配迭代器。这很好用

 int k = 5;
    int count = 0;
    ArrayList<Integer> ArrGirls = new ArrayList<>((List<Integer>) Arrays.asList(new Integer[]{34, 37, 28, 16, 44, 36, 37, 43, 50, 22}));
    ArrayList<Integer> ArrBoys = new ArrayList<>((List<Integer>) Arrays.asList(new Integer[]{13, 28, 41, 10, 14, 27, 41, 27, 23, 37}));
    for (Iterator<Integer> iteG = ArrGirls.iterator(); iteG.hasNext();) {
        {
            Integer ArrGirl = iteG.next();
            for (Iterator<Integer> iteB = ArrBoys.iterator(); iteB.hasNext();) {
                Integer ArrBoy = iteB.next();
                int dif = (int) Math.abs(ArrBoy - ArrGirl);
                if (dif <= k) {
                    System.out.println("we took " + ArrBoy + " from boys with "
                            + ArrGirl + " from girls, thier dif is " + dif);
                    ArrBoys.remove(ArrBoy);
                    ArrGirls.remove(ArrGirl);
                    iteG = ArrGirls.iterator();//You have to reset the value of iterationGirls
                    count++;
                    break;
                }
            }
        }
    }
    System.out.println(count);

关于java - 从2个for循环中的java中的2个ArrayList中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31035333/

相关文章:

algorithm - 网格中的随机数

java - 一个字段上有两个 hibernate validator 。仅需选择一项

java - Apache Ant : Execute subsequent targets without waiting for completion

php - CodeIgniter 错误、result_array 和 foreach 错误

c - 使用 extern 声明数组时指定其大小有什么不同吗?

algorithm - 白平衡算法

java - 是否有与 @Assisted 等效的 javax.inject.*

java - Hibernate open-close SessionFactory on every query vs on app instance

java - List<Byte> to String,你能帮忙重构这个(小)方法吗?

algorithm - 用 Pbasic 中的 boe-bot 计算迷宫的最短距离