有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

查找多维数组是否在Java数组中

我有一个数组-与此类似:

import java.util.Arrays;

public class test {
    public static void main(String[] args)
    {

        String[][] A = { { "a", "b", "c" }, { "d", "e", "f" }, { "g", "h", "-" } };
        String[][] B = { { "-", "e", "b" }, { "a", "h", "c" }, { "d", "g", "f" } };
        String[][] C = { { "a", "b", "c" }, { "d", "e", "f" }, { "g", "h", "-" } };
        String[][][] myArray = { A, B};

        for (String[][] s : myArray) {
            System.out.println(Arrays.deepToString(s));
            if (Arrays.deepToString(s).equals(Arrays.deepToString(C))) {
                System.out.println("true");
            }
        }
    }
}

我需要检查数组中是否有值,但是,这是我发现唯一有效的方法,而且效率非常低

既然大多数内置方法似乎不起作用,有没有更好的方法来实现这一点

我还试着使用一个集,它有同样的问题


共 (2) 个答案

  1. # 1 楼答案

    另一种方法是将数组存储/散列为StringBuilder,并将其与多维数组中形成的StringBuilder进行比较

    对于字符串操作,StringBuilder比String更快。代码如下:

    import java.util.Arrays;
    
    public class test {
        public static void main(String[] args)
        {
    
            String[][] A = { { "a", "b", "c" }, { "d", "e", "f" }, { "g", "h", "-" } };
            String[][] B = { { "-", "e", "b" }, { "a", "h", "c" }, { "d", "g", "f" } };
            String[][] C = { { "a", "b", "c" }, { "d", "e", "f" }, { "g", "h", "-" } };
            String[][][] myArray = { A, B};
            StringBuilder str = new StringBuilder();
            StringBuilder str1 = new StringBuilder();
            for(String[] ss : C){
                for(String s : ss){
                    for(char p : s.toCharArray()){
                                str1.append(p);
                            }
                }
            }
            String cc = str1.toString();
            for(String[][] s : myArray){
                for(String[] ss : s){
                    for(String sss : ss){
                        for(char p : sss.toCharArray()){
                            str.append(p);
                        }
                        if(str.toString().equals(cc)){
                            System.out.println("true");
                        }
                    }
                }
            }
            
        }
    }
    
  2. # 2 楼答案

    这很简单:永远不要转换为字符串。试试deepEquals它应该做你想做的事情,当然你首先必须深入myArray并迭代元素

    public static boolean contains(String[][][] set, String[][] obj) {
        for (String[][] elt : set) {
            if (Arrays.deepEquals(elt, obj)) {
                return true;
            }
        }
        return false;
    }
    

    这将在大约4.5%的时间内执行测试集的contains函数


    当涉及到对象(包括其他数组)上的数组时,Java具有类型擦除功能。因此,在使用Arrays.equals(String[], String[])的地方自己创建deepEquals(String[][], String[][])可能会稍微快一些,因为在运行时不必检查对象是否是String的数组,也不必检查是否有嵌套得更深的数组

    public static boolean fasterContains(String[][][] set, String[][] obj) {
        for (String[][] elt : set) {
            if (deepEquals(elt, obj)) {
                return true;
            }
        }
        return false;
    }
    
    private static boolean deepEquals(String[][] a, String[][] b) {
        int n = a.length;
        if (b.length != n) {
            return false;
          }
          
         for (int i = 0; i < n; i++) {
            if (!Arrays.equals(a[i], b[i])) {
                return false;
            }
        }
        return true;
    }
    

    这将在大约3.5%的时间内执行测试集的contains函数,但只比上面的测试稍微复杂一些


    作为一般提示:当涉及到字符串时,计算机是没有效率的(尽管较新的Java版本确实在某种程度上解决了这一问题)。无论如何,永远不要转换为字符串,以进行任何比较、计算、连接或诸如此类的操作。始终比较字节、整数或对象(即原始数据),除非确实没有其他方法


    如果您只有一个字符列表,则有两个观察结果:

    • char[][]也应该起作用
    • 当然,也可以只是一个String[],其中字符串由各种字符组成(您可以使用String#charAt(index)检索这些字符,并使用String#equals(other)进行比较)

    使用后者,您可以将搜索时间减少到2%左右