簡體   English   中英

在一組 arrays 中查找唯一項目並從 arrays 中刪除非唯一項目

[英]find unique items in a set of arrays and remove non-uniques from arrays found

給定一個 object,其中Key作為一個數組(位置), Value作為一個數組:

// Example Object
0,2 : [6, 8, 9]
0,3 : [1, 6, 8]
0,4 : [6, 8]
0,5 : [6, 8]
0,6 : [4, 5, 8, 9]
0,7 : [5, 8]
0,8 : [4, 5, 7, 9]

(它是這樣創建的:

x = {};
x[[0,2]] = [6, 8, 9];
x[[0,3]] = [1, 6, 8];
...

現在,我想將我的 object 縮小到這個范圍,方法是檢查 Array 中的任何數字是否僅出現在該數組中,而不出現在其他值的 arrays 中,然后消除包含唯一編號的特定數組中的所有其他數字。
(規則:在給定的數組中沒有重復,所以不需要檢查):

// Result Object
0,2 : [6, 8, 9]
0,3 : [1]
0,4 : [6, 8]
0,5 : [6, 8]
0,6 : [4, 5, 8, 9]  // now 4 becomes also a "loner"
0,7 : [5, 8]
0,8 : [7]

所以在 Key [0,3] 中,Value 的數組被縮小到只有 [1],因為 1 是一個唯一的數字,不會出現在另一個數組中。

我很難想到一個有效的模式......

不明白為什么 0,4 是 [6, 8]。 6 和 8 都已經出現在 0,2: [6, 8, 9] 中。

u = [];
$.each(x, function(i, arr){
    //console.log(arr);
    x[i] = $.grep(arr, function(elem, i){
        return ($.inArray(elem, u) == -1);
    });
    $.merge(u, arr);
});

演示

Object x 被修改為

0,2: [6, 8, 9]
0,3: 1
0,4:[]
0,5:[]
0,6: [4, 5]
0,7:[]
0,8: [7]

$.each(x, function(i, arr){
    u = [];
    $.each(x, function(j, arrJ){
        $.merge(u, i == j ? [] : arrJ);
    });

    var ue = null;
    $.each(arr, function(i, elem){
        if ($.inArray(elem, u) == -1) {
            ue = elem;
        }
    });

    if (ue != null){
        arr.length = 0;
        arr[0] = ue;
    }
});

演示

這個想法是使用存儲桶,認為這是一個有趣的實驗,我知道代碼可以優化,而且不是那么漂亮,但它解決了問題,而且效率並不低:

var x = {};  // object

x[[0,2]] = [6, 8, 9];
x[[0,3]] = [1, 6, 8];
x[[0,4]] = [6, 8];
x[[0,5]] = [6, 8];
x[[0,6]] = [4, 5, 8, 9];
x[[0,7]] = [5, 8];
x[[0,8]] = [4, 5, 7, 9];

var trackCount = [];

for(var key in x){
  for(var j in x[key]){
     // console.log(key);
          if(typeof(trackCount[x[key][j]]) === "undefined"){
       trackCount[x[key][j]] = [];
      }
     // trackCount[x[key][j]].push(trackCount[x[key]]);
       trackCount[x[key][j]].push(key);
  }
}
//console.log(trackCount)
for(var i=0;i<trackCount.length;++i){
   if(trackCount[i] && trackCount[i].length == 1){
     x[trackCount[i][0]] = [];
     x[trackCount[i][0]].push(i)
   }
}
console.log(x);

冗長的方法( jsfiddle

var sudoku    =  { '0,2' : [6,8,9]
                 , '0,3' : [1,6,8]
                 , '0,4' : [6,8]
                 , '0,5' : [6,8]
                 , '0,6' : [4,5,8,9]
                 , '0,7' : [5,8]
                 , '0,8' : [4,5,7,9]
                 };

var finished  =  false;

while (!finished) {
    var unique  =  {};
    finished    =  true;

    // Build Unique Numbers List
    for (var section in sudoku)
        for (var pos = sudoku[section].length; pos--; ){
            if (typeof unique[ sudoku[section][pos] ] === "undefined")
                unique[ sudoku[section][pos] ] = [];

            unique[sudoku[section][pos]].push(section);
        }    

    // Clean Up Unique Numbers List
    for (var num in unique)
        if (unique[num].length > 1)
            delete unique[num];

    // Remove non-Uniques
    var is_unique = false;
    for ( var num in unique )
        for ( var pos = sudoku[ unique[num] ].length; pos--; ){
            is_unique = false;
            for (var unique_value in unique)
                if (sudoku[ unique[num] ][pos] == unique_value){
                    is_unique = true;
                    break;
                }

            if (!is_unique){
                sudoku[ unique[num] ].splice(pos,1);
                finished = false;
            }
        }
}

console.clear();
console.dir(unique);
console.dir(sudoku);
/**/

結果

{數獨}
[0,2]:[9]
[0,3]: [1]
[0,4]: [6, 8]
[0,5]: [6, 8]
[0,6]: [4]
[0,7]: [5]
[0,8]: [7]


注意:這不是最優化的算法,但由於這是針對數獨的,因此性能不會真正受到您選擇的任何算法的影響。 所以,為了簡潔,我會選擇 amit_g 的 jQuery 解決方案。 否則,上述內容對於解釋和准確性都應該很好。

編輯:這已被修改為遞歸過濾結果。

我將創建一個單獨的單維數組來跟蹤多維數組中的值。

遍歷多維數組中的每個值。 如果一維數組中不存在該值,則將其添加到一維數組中,並保留在多維數組中。 如果該值確實存在於單維數組中,只需將其從多維數組中刪除並移至下一個值。

這里的想法是我 go 通過每個數組中的每個數字,並檢查它
一個包含來自所有 arrays 的所有數字的存儲桶(字符串),已加入。 如果存儲桶中當前x[key][i]的第一個索引與最后一個索引相同,則意味着該數字是唯一的,因此它的持有數組被重置為單獨保存該數字。

var x = {};  // object

x[[0,0]] = [6, 8, 9];
x[[0,1]] = [1, 6, 8];
x[[0,2]] = [6, 8];
x[[0,3]] = [6, 8];
x[[0,4]] = [4, 5, 8, 9];
x[[0,5]] = [5, 8];
x[[0,6]] = [4, 5, 7, 9];

function findUniquePosibilites(x){
    var bucket = "";
    for(var key in x)
        bucket += x[key].join("");

    for(var key in x)
        for (var i = x[key].length; i--; ){
            var num = x[key][i];
            if( bucket.indexOf(num) ==  bucket.lastIndexOf(num) ){
                x[key] = [num];
                break;
            };
        }
}

findUniquePosibilites(x);
console.dir( x );

/*
0,0 : [6, 8, 9] 
0,1 : [1]
0,2 : [6, 8]
0,3 : [6, 8]    
0,4 : [4, 5, 8, 9]  
0,5 : [5, 8]    
0,6 : [7]
*/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM