如何在2个多维数组中查找公共值

时间:2019-05-23 18:30:15

标签: javascript arrays multidimensional-array

问题是我有两个2D数组,因此需要获取的公共值  都。所以我如何检查两个数组中的公共值。

我为此编写了嵌套的for循环,在这里我  添加一些虚拟数组数据以显示目的:

 var arr1 = [[0,0],[0,1],[0,2],[1,0][1,1],[1,2],[2,0],[2,2]];
 var arr2 = [[0,1],[0,0],[2,2]];

 var commonValueIndex = [];
 for(var i=0; i<arr1.length; i++){
  for(var j=0; j<arr2.length; j++){
    if(arr1[i][j] == arr2[i][j]){
       commonValueIndex.push([i,j]);
     }
   }
  }

需要查找公用值并将其索引存储在另一个数组中。请提出任何建议。

3 个答案:

答案 0 :(得分:1)

您的代码中有一个逻辑错误。 看看这一行:

private TourElement createElementList(int[][] waypoints){
        assert waypoints.length > 0;
        TourElement elem = new TourElement();
        int lastIndex = waypoints.length-1;
        Waypoint wp = createWaypoint(waypoints[lastIndex][0], waypoints[lastIndex][1]);
        elem.setWaypoint(wp);
        for (int i = lastIndex-1; i >= 0 ; i--) {
            wp = createWaypoint(waypoints[i][0], waypoints[i][1]);
            elem = elem.addStart(wp);
        }
        return elem;
    }

在这里,您尝试比较两个数组中的各个元素。不幸的是, i 包含arr1的当前元素,而arr2的 j -因此,您实际上是在这里比较苹果和橙子。此外,每个元素都包含另一个索引为0和1的数组,您不会在任何地方进行比较。

这是正确的比较:

private Waypoint createWaypoint(int x, int y) {
        Waypoint wp = new Waypoint();
        wp.setXY(x, y);
        return wp;
    }

或完整的示例:

if(arr1[i][j] == arr2[i][j])

将输出正确的公用值

  

[[0,0],[0,1],[2,2]]

答案 1 :(得分:1)

除了接近二次方的方法外,您还可以获取带有字符串化数组的映射,并在一个循环中对照另一个数组进行检查。然后只需过滤项目,而不必在另一个数组中找到相同的值即可。

<% 
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/jigyasa";
String user="root";
String pass="";

    Connection con = null;
    Statement stmt = null;
    ResultSet result = null;
    response.setContentType("application/json");
    response.setHeader("cache-control", "no-cache");

    try{
        Class.forName(driver);
        con = DriverManager.getConnection(url,user,pass);
    }catch(ClassNotFoundException e){
    }catch(SQLException e){}

    try{

        String query;

        stmt = con.createStatement();

        query = "SELECT * FROM englishq";
        result = stmt.executeQuery(query);

        if(!result.next()){
            out.print("0");
        }else{
            JSONArray array=new JSONArray();
            do{
                JSONObject obj = new JSONObject();
                obj.put("qid",result.getString("qid"));
                obj.put("question",result.getString("question"));
                System.out.println(result.getString("qid"));  
                System.out.println(result.getString("question")); 
                array.put(obj);

            }while(result.next());
             out.print(array.toString());

            out.flush();
         }

    }catch(SQLException e){
        out.print("Exception: "+e);
    } 

%>




var array1 = [[0, 0], [0, 1], [0, 2], [1, 0][1, 1], [1, 2], [2, 0], [2, 2]],
    array2 = [[0, 1], [0, 0], [2, 2]],
    map = new Map(array2.map((v, i) => [JSON.stringify(v), i])),
    indices = array1
        .map((v, i) => map.has(JSON.stringify(v)) && [i, map.get(JSON.stringify(v))])
        .filter(Boolean),
    common = array1.filter(v => map.has(JSON.stringify(v)));

console.log(indices);
console.log(common);

答案 2 :(得分:0)

如果我正确理解了您的问题,那么您希望将匹配值的索引存储在arr1arr2中。如果是,那么您需要将if条件更新为关注

var arr1 = [[0,0],[0,1],[0,2],[1,0][1,1],[1,2],[2,0],[2,2]];
var arr2 = [[0,1],[0,0],[2,2]];
var commonValueIndex = [];
for (var i = 0; i < arr1.length; i++) {
  for (var j = 0; j < arr2.length; j++) {
    if (arr1[i][0] == arr2[j][0] && arr1[i][1] == arr2[j][1]) {
      commonValueIndex.push([i, j]);
    }
  }
}
console.log(commonValueIndex);