l oop для создания массива массивов строк одинаковой длины - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь создать массив массивов, которые сгруппированы в соответствии с их длинами (строками), так что следующий массив:

var testA = ["carts","carts","cars","cars","ca","ca", "ca","a","a","a","a"];

станет:

var sortedArrays = [["carts","carts"], ["cars","cars"],["ca","ca","ca"], ["a","a","a","a"]]

В настоящее время я пробую l oop ниже, но просто не могу заставить это работать. Я знаю, что это будет что-то простое, но я потратил так много времени, пытаясь завершить это без того, чтобы это оказалось невероятно расстраивающим.

 var testA = ["carts","carts","cars","cars","ca","ca", "ca","a","a","a","a"];
 var sortedArrays = [];

 for(i=0; i < testA.length; i++){
     longestWord = 0;
     wordHolder = []
     wordHolder.push(testA[i])    

 if (testA[i].length > longestWord){
     longestWord = testA[i].length
     wordHolder.push(testA[i])
 }
 sortedArrays.push(wordHolder)

 }

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Придерживаясь сценария java, я смог сделать следующее. Я предполагаю, что слова уже отсортированы по убыванию по длине и что есть только одно слово каждой длины. Это основано на том, что вы делали. Я думаю, что происходило то, что слишком много инициализировалось или сбрасывалось каждый раз через l oop.

var testA = ["carts", "carts", "cars", "cars", "ca", "ca", "ca", "a", "a", "a", "a"];
var sortedArrays = [];
var wordHolder = []; // took outside loop to ensure initialized
var curLength = testA[0].length;// assuming here that testA not empty
for (var i = 0; i < testA.length; i++) {
  if (testA[i].length === curLength) { // more of the same
    wordHolder.push(testA[i]);
  } else { // new block starts
    curLength = testA[i].length;
    sortedArrays.push(wordHolder);
    // alert (wordHolder)
    // alert (sortedArrays)
    wordHolder = [];
    wordHolder.push(testA[i]);
  }
}
sortedArrays.push(wordHolder);// add the last one
1 голос
/ 12 февраля 2020

А как насчет следующего кода (Swift, но его легко переформулировать на других языках):

let testA = ["carts","carts","cars","cars","ca","ca", "ca","a","a","a","a"]
var maxLength = 0
for string in testA {
    if string.count > maxLength { maxLength = string.count }
}
var sortedArrays: [[String]] = []
for nextLength in 0 ... maxLength {
    let invertedLength = maxLength - nextLength
    let nextArray = testA.filter { $0.count == invertedLength }
    sortedArrays.append(nextArray)
}

Этот код также создает пустые массивы, которые, конечно, можно легко пропустить.

Вопрос, конечно, в том, каковы ваши требования. Приведенный выше код компактен, но он не быстр для больших массивов ...
Для больших массивов было бы лучше сначала отсортировать testA, а затем извлечь элементы.

...