2013-11-18 2 views
1

У меня есть массив строкКак преобразовать обычный массив в двумерный массив с зубцами?

String myArray [] = {"user1", "doc2", "doc5", "user2", "doc3", "doc6", "doc8", "user3", "doc 10" }

Смысл в том, что user1 имеет doc2 и doc5 ... user3 имеет только doc10 и т.д.

Я хочу, чтобы преобразовать этот массив в двухмерном зубчатым

String myArray2 [] [] = { {"user1", "doc2", "doc5"} , {"user2", "doc3", "doc6", "doc8"} , {"user3", "doc 10"} }

Как я могу сделать это наиболее эффективно? (У меня есть логика, которая работает, сталкиваясь с элементом, который имеет подстроку «пользователь» и создает новый элемент массива с зазубринами. Но я уверен, что мой алгоритм далек от наиболее эффективного)

+2

* самый эффективно *? Создайте объект 'User' с' Collection '/' Collection 'документов. –

+0

Я думал, что есть что-то вроде 'split', которое также может быть применено не только к строке, но и к массиву, разбивая его на следующий уровень. –

+0

Не то, чтобы я знал. Было бы гораздо лучше поддерживать 'Collection ' пользователей вместо массива массивов. –

ответ

1

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

Вы можете избежать изменения размера массивов, предварительно подсчитав количество элементов массива, которое будет иметь результат, создав массив результатов, а затем снова отсканируйте массив с начала для следующей позиции "userX" и вызовите arrayCopy, чтобы скопировать элементов в подматрицы выходного массива.

2

Несколько вещей:

Во-первых, похоже, что у вас уже есть алгоритм, который работает. В чем проблема? В таких случаях нет «наиболее эффективных». Существует только эффективный (он дает правильные результаты) и не эффективен (он дает неверные результаты). Вы создали алгоритм, который удовлетворяет вашим требованиям. Вы сделали.

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

Или, по словам «наиболее эффективных», вы имеете в виду «меньше строк кода»? Зачем? Является ли ваш код понятным? Легко ли поддерживать и может ли читатель легко понять, каковы его намерения? Если нет, рассмотрите добавление описательных комментариев. Если это так, то вам нечего выиграть, и вы закончите.

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

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

+0

+1 Очень правдивые замечания. – Ingo

Смежные вопросы