Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Сортировка входных данных JS


Автор: sortMePlease 4.8.2013, 16:35
Приветствую всех. Прошу помочь мне с обработкой входных данных и в дальнейшем с сортировкой. Есть задание: у меня есть катрочки (много), на каждой из них написано по две страны (пункт прибытия/отправки), например:

1) Турция - Монголия; 
2) Китай - ЮАР;
3) ЮАР - Турция;
4) Россия - Китай, и т.д.

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

Россия - Китай
Китай - ЮАР
ЮАР- Турция
Турция - Монголия


Я бы хотел рассмотреть ситуацию, когда мы вводим данные через метод prompt, например: вводим (Россия - Китай) и вводим слова-связки (страны) до тех пор пока не закрываем окно ввода. Только возникает следующие вопросы:
1) Каким образом я должен хранить вводимые данные: создавать в цикле новые переменные или один массив, в который будут добавляся элементы, а дальше сравнивать их? 
2) Ну и сортировка, думаю, что сортировать надо по всей длине слова, а не по первым буквам, иначе при вводе стран могут быть и ситуации, когда мы можем ввести Монголию, Малайзию и прочие страны начинающиеся с одинаковой буквы.

Автор: sortMePlease 4.8.2013, 22:11
Хоть идейку подкинте)

Автор: CruorVult 5.8.2013, 08:25
1) ничерта не понял
2) метод Array.sort адекватно сортирует по всем символам

Автор: sortMePlease 5.8.2013, 12:57
Цитата(CruorVult @  5.8.2013,  08:25 Найти цитируемый пост)
1) ничерта не понял2) метод Array.sort адекватно сортирует по всем символам

Так как у меня количество карточек может быть большим, то я ввожу большое количество стран. И возникает вопрос: как-то, ведь, я должен хранить эти данные (массив, или переменные), чтобы в дальнейшем рассортировать их.

Автор: CruorVult 5.8.2013, 13:24
Если данных много, то хранить их нужно в массиве!

Автор: sortMePlease 5.8.2013, 13:34
Цитата

Если данных много, то хранить их нужно в массиве!

То есть создаем цикл, в котором будет обновляться содержимое массива?
Можешь пример кода скинуть?

Автор: CruorVult 5.8.2013, 13:54
Цитата(sortMePlease @  5.8.2013,  13:34 Найти цитируемый пост)
То есть создаем цикл, в котором будет обновляться содержимое массива?


Повторюсь
Цитата(CruorVult @  5.8.2013,  08:25 Найти цитируемый пост)
ничерта не понял


Я не зря это написал. Сформулируй конкретно вопрос без всяких там карточек и промптов. Какие входящие данные, какие действия нужно произвести и что должно получиться в итоге.

Автор: sortMePlease 5.8.2013, 15:58
В целом нужно рассортировать данный список:

1) Турция - Монголия; 
2) Китай - ЮАР;
3) ЮАР - Турция;
4) Россия - Китай, и т.д.

И получить:

Россия - Китай
Китай - ЮАР
ЮАР- Турция
Турция - Монголия


Желательно получить сортировщик, работающий с любым количеством слов-связок (страны), если все они (слова-связки) образуют одну неразрывную цепочку.
user posted image

Автор: akizelokro 6.8.2013, 17:27
Перебором

Код

var ways = [];
var end_ways = [];
ways.pushback({from: "Россия", to:"Китай"});
...
for ( var i = 0; i < ways.length; i++)
{
    var to = ways[i].to;
    for (var j = i + 1; j < ways.length; j++)
    {
        if(ways[j].from.toString() == to.toString())
            ...
    }
}



Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51fe58c36ccc19695b000002#findElement_E7045_520107c86ccc19da1c003346_0

Автор: akizelokro 6.8.2013, 17:28
В тонкостях разберёшься.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51fe58c36ccc19695b000002#findElement_E7045_520107f46ccc19e64c0020de_0

Автор: CruorVult 6.8.2013, 19:09
Код

function buildMap(arr, map) {
    
    var current = arr.pop();
    if (!map.length) {
        map.push(current);
    } else {
        var start = map[0];
        var last = map[map.length-1];
        if (current[1] == start[0]) {
            map = [].concat([current], map);
        } else if (current[0] == last[1]) {
            map.push(current);
        } else {
            arr = [].concat([current], arr);
        }
    }
    return arr.length ? buildMap(arr, map) : map;
}


Использование

Код

buildMap([
    ['Турция', 'Монголия'],
    ['Китай', 'ЮАР'],
    ['ЮАР', 'Турция'],
    ['Россия', 'Китай']
], [])


П.С. Если цепочка будет некорректная, то не исключено зацикливание

Автор: sortMePlease 6.8.2013, 21:34

Прокомментируй пожалуйста этот кусок, просто я понмаю это как: если "НЕ" длина массива map, то... 
  
Код

function buildMap(arr, map) {
    

  var current = arr.pop();
    if (!map.length) {
        map.push(current);} 


Код

else {
        var start = map[0];
        var last = map[map.length-1];
        if (current[1] == start[0]) {
            map = [].concat([current], map);
        } else if (current[0] == last[1]) {
            map.push(current);
        } else {
            arr = [].concat([current], arr);
        }
    }
    

Здесь я пытаюсь вывести выходной массив arr, однако он выдал следущее:Турция,Монголия,Китай,ЮАР,ЮАР,Турция.
  
Код

var arrDlina= arr.length;
 return arrDlina, document.write(arr)  ? buildMap(arr, map)  : map;
}
buildMap([
    ['Турция', 'Монголия'],
    ['Китай', 'ЮАР'],
    ['ЮАР', 'Турция'],
    ['Россия', 'Китай']
], [])

</script>
</div>
</body>
</html>


Автор: CruorVult 7.8.2013, 11:45
Цитата(sortMePlease @  6.8.2013,  21:34 Найти цитируемый пост)
var arrDlina= arr.length;
 return arrDlina, document.write(arr)  ? buildMap(arr, map)  : map;
}


Что это  smile 


Цитата(sortMePlease @  6.8.2013,  21:34 Найти цитируемый пост)
Прокомментируй пожалуйста этот кусок, просто я понмаю это как: если "НЕ" длина массива map, то... 


Код

!1 //false
!5 //false
!0 //true


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

Автор: sortMePlease 7.8.2013, 13:49
CruorVult, благодарю. Прости за тупизм, сейчас разобрался. На счет тернарных операторов: по мере программирования в js почти не сталкивался с ними.
Еще раз спасибо всем, кто участвовал.

Автор: skyboy 8.8.2013, 00:28
конкретный алгоритм не подскажу, но искать надо "поиск цикла в графе".
если у тебя не обязательно все элементы использовать, чтоб найти цикл — это лучше перебора.
если у тебя много элементов — это лучше перебора.
если у тебя есть разветвления — когда из одной страны несколько вариантов — это надежней перебора.
в любом другом случае, понятно, перебор — вполне справится с задачей )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)