2014-12-05 3 views
0

Генерация матрицы из множества массивов

var set1 = [14, 9, 1, 6, 16], 
 
    set2 = [4, 15, 16, 14, 11], 
 
    set3 = [16, 10, 2, 3, 8], 
 
    set4 = [3, 17, 16, 6, 14], 
 
    set5 = [19, 18, 14, 6, 20], 
 
    set6 = [6, 15, 8, 7, 2], 
 
    set7 = [15, 14, 2, 19, 3], 
 
    set8 = [8, 2, 14, 10, 5], 
 
    set9 = [11, 6, 8, 10, 18], 
 
    set10 = [14, 10, 12, 4, 18], 
 
    input = [set1, set2, set3, set4, set5, set6, set7, set8, set9, set10]; 
 

 
// Sort function 
 
function sortFunction(a) { 
 

 
    var len = a.length, 
 
    temp, i, j; 
 

 
    for (i = 0; i < len; i++) { 
 
    for (j = i + 1; j < len; j++) { 
 
     if (a[j] < a[i]) { 
 
     temp = a[i]; 
 
     a[i] = a[j]; 
 
     a[j] = temp; 
 
     } 
 
    } 
 
    } 
 
    return a; 
 
} 
 

 
// Sorting each sets and finding range of each sets 
 
for (var i = 0; i < len; i++) { 
 

 
    input[i] = sortFunction(input[i]); 
 
    minRange.push(Math.min.apply(null, input[i])); 
 
    maxRange.push(Math.max.apply(null, input[i])); 
 
} 
 

 
// Finding the range of input 
 

 
var minimum = Math.min.apply(null, minRange); 
 
var maximum = Math.max.apply(null, maxRange); 
 
var range = maximum - minimum + 1; 
 

 

 
// Matrix table function 
 
var tableArray = []; 
 

 
function table() { 
 
    for (var i = 0; i < len; i++) { 
 
    for (var j = 0; j < range; j++) { 
 
     if (input[i][j] == j) { 
 
     tableArray[i].push(input[i][j]); 
 
     } else { 
 
     tableArray[i].push(0); 
 
     } 
 
    } 
 
    tableArray.push(tableArray[i]); 
 
    } 
 
    return tableArray; 
 
}

У меня возникают проблемы решения этой проблемы: вход представляет собой набор из 10 массивов, где каждый массив содержит 5 различного числа в диапазоне 1 - 20.

вход = [[14, 9, 1, 6, 16], [4, 15, 16, 14, 11], [16, 10, 2, 3, 8], [3, 17, 16, 6, 14], [19, 18, 14, 6, 20], [6, 15, 8, 7, 2], [15, 14, 2, 19, 3], [8, 2, 14, 10, 5], [11, 6, 8, 10, 18], [14, 10, 12, 4, 18]]

I w чтобы генерировать матрицу 10x20 в качестве выхода, где каждая строка имеет 20 номеров со следующим шаблоном:

output = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 14, 0, 16, 0, 0, 0, 0], [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 15 , 16, 0, 0, 0, 0], [...] ...]

Im используя JavaScript, чтобы решить эту проблему ...

+0

Я просто добавил свой код, но его беспорядок, и я не могу понять, что случилось с ним –

ответ

1

Создать новый выходной массив:

var out = []; 

Loop над входным массивом. Для каждого вложенного массива создайте новый массив в выходном массиве, заполненном 20 нулями, а затем просто замените те элементы в выходном массиве значением элемента в массиве ввода гнезда в нужном месте. Поскольку вы знаете размер вложенного массива, и он маленький, проще просто перечислять каждый элемент, а не использовать внутренний цикл.

for (var i = 0, l = arr.length; i < l; i++) { 
    var el = arr[i]; 
    out[i] = Uint8Array(20); 
    out[i][el[0] - 1] = el[0]; 
    out[i][el[1] - 1] = el[1]; 
    out[i][el[2] - 1] = el[2]; 
    out[i][el[3] - 1] = el[3]; 
    out[i][el[4] - 1] = el[4]; 
} 

DEMO

Если ваш браузер не поддерживает Uint8Array вы можете использовать отдельную функцию, чтобы создать мягкий массив:

function padArray() { 
    var out = []; 
    for (var i = 0, l = 20; i < l; i++) { 
    out.push(0); 
    } 
    return out; 
} 

и польза:

out[i] = padArray(); 
+0

Спасибо Энди, Ваш ответ работает отлично за исключением того, что вам необходимо изменить out [i] [arr [i] [0]] = arr [i] [0]; out [i] [arr [i] [1]] = arr [i] [1]; out [i] [arr [i] [2]] = arr [i] [2]; out [i] [arr [i] [3]] = arr [i] [3]; out [i] [arr [i] [4]] = arr [i] [4]; с out [i] [arr [i] [0] -1] = arr [i] [0]; out [i] [arr [i] [1] -1] = arr [i] [1]; out [i] [arr [i] [2] -1] = arr [i] [2]; out [i] [arr [i] [3] -1] = arr [i] [3]; out [i] [arr [i] [4] -1] = arr [i] [4]; –

+1

@ Саид, сделано. Я пропустил это. – Andy

0

Вы действительно должны пробовали сами. Это довольно легко. Начните с массивом из 20 нулей, а затем заполнить слоты со значениями из массива:

function posArray(arr, max) { 
    var res = []; 

    for (var i = 0; i < max; i++) res.push(0); 

    for (var i = 0; i < arr.length; i++) { 
     var a = arr[i]; 

     if (a > 0 && a <= max) res[a - 1] = a; 
    } 

    return res; 
} 

var output = []; 

for (var i = 0; i < input.length; i++) { 
    output.push(posArray(input[i], 20)); 
} 
+0

я добавил свой код, и я знаю, что это легко, но я не могу понять это лол –

0

что-то например, это будет работать (не проверено):

var set1 = [14, 9, 1, 6, 16], 
    set2 = [4, 15, 16, 14, 11], 
    set3 = [16, 10, 2, 3, 8], 
    set4 = [3, 17, 16, 6, 14], 
    set5 = [19, 18, 14, 6, 20], 
    set6 = [6, 15, 8, 7, 2], 
    set7 = [15, 14, 2, 19, 3], 
    set8 = [8, 2, 14, 10, 5], 
    set9 = [11, 6, 8, 10, 18], 
    set10 = [14, 10, 12, 4, 18], 
    input = [set1, set2, set3, set4, set5, set6, set7, set8, set9, set10]; 
var output = []; 

for (var e=0; e<input.length; e++) { 
    newRow = []; 
    for (var i=0;i<20; i++) { 
    if (input[e].indexOf(i) > -1) { 
     newRow.push(i); 
    } 
    else { 
     newRow.push(0); 
    } 
    } 
    output.push(newRow); 
} 
alert(output); 
Смежные вопросы