比较2D矩阵Java中每一行的元素

时间:2019-11-19 21:00:28

标签: java

我试图比较2D矩阵的一行中每个元素的值,以确保每个元素彼此都不相同。

这是我的职能:

    private static boolean CompareComponentValue(int[][] m) {
    int k = 0;
    for (int i = 0; i < m.length; i = i + 1) {
        for (int j = 1; j < m[i].length; j = j + 1) {
            if (m[i][k] == m[i][j]) {
                return false;
            }
        }
        k = k + 1;
    }
    return true;
}

我当时想我必须像这样对每个元素进行分配:[0] [0]与[0] [1],[0] [2] ... [0] [n]不同,然后: [0] [1]与[0] [2] ... [0] [n]不同,当然,对于每一行,[1] [0]与[1] [1],[1]也不同] [2] ... [1] [n]。

我无法使其正常工作,因为有时它不应该返回false。

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class Solution {
    public static void main(String[] args) throws IOException {
        Integer n[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
        Integer x[][] = { { 1, 2, 2 }, { 4, 5, 6 }, { 7, 8, 9 } };
        System.out.println(compareComponentValue(n));
        System.out.println(compareComponentValue(x));
    }

    private static boolean compareComponentValue(Integer[][] m) {
        for (int i = 0; i < m.length; i++) {

            // Add the row i.e. m[i] to a Set
            Set<Integer> set = Arrays.stream(m[i]).collect(Collectors.toSet());

            // If there will be any duplicate values in m[i], they will be rejected by the
            // set and therefore the size of the set won't be equal to the size of m[i]
            if (set.size() != m[i].length)
                return false;
        }
        return true;
    }
}

解决方案基于以下事实:集合拒绝非唯一值。

输出:

true
false

答案 1 :(得分:0)

“ ...,以确保每个元素都互不相同。

您需要的是Set。使用addcontains操作可以很容易地将元素添加到集合中并测试元素是否已经在集合中。而且,这些操作都需要O(1)时间,因此解决方案将很有效;无需一次又一次地搜索矩阵。

此外,如果您只需要值而不是索引,则使用“增强的for循环”。

import java.util.*;

public class CheckMatrix {
    public static boolean hasDuplicate(int[][] matrix) {
        Set<Integer> seen = new HashSet<>();

        for(int[] row : matrix) {
            // empty the set, to only check for duplicates within a single row
            seen.clear();

            for(int x : row) {
                if(seen.contains(x)) { return true; }
                seen.add(x);
            }
        }

        return false;
    }
}

如果想花哨的话,可以使用以下事实:the add method返回一个boolean,指示是否x不存在:将内部循环体替换为:

                if(!seen.add(x)) { return true; }

答案 2 :(得分:0)

首先,谢谢大家的回答,但它们确实超出了我的水平,正如我在开始时所说的那样,由于我仍然是入门者,我暂时不使用任何软件包,我想留下来基本逻辑,最后我通过认真思考得到了答案。

    private static boolean NumerosDistintosFila(int[][] m) {
    for (int i = 0; i < m.length; i = i + 1) {
        for (int k = 0; k < m.length - 2; k = k + 1) {
            for (int j = 1 + k; j < m[i].length; j = j + 1) {
                if (m[i][k] == m[i][j]) {
                    return false;
                }
            }
        }
    }
    return true;
}

我添加了另一个带变量k的for循环,我发现它从未超过矩阵的长度-2,例如,如果我使用5x5,则需要它达到3。 这是因为,例如,我需要在第一行中比较的最后一个元素是[0] [3]至[0] [4]。

我的逻辑是我需要比较元素而不重复它们之间的比较,因此这段代码基本上是将第一个元素与同一行中的每个元素进行比较,然后将第二个元素与除第一个元素之外的每个元素进行比较,然后第三元素,第四和第五等。

再次感谢你们提供的解决方案,我尝试了它们,并且它们都工作正常,但是正如我所说的,我现在想保留基本逻辑。