Доступ к элементам в древовидной структуре - PullRequest
1 голос
/ 06 мая 2011

Я пытаюсь сделать что-то очень простое в Java, и я немного почесал голову. По сути, мне нужно прочитать какой-либо элемент из файла в некоторый тип массива или списка, отсортировать их, удалить дубликаты, а затем вернуть первые три элемента. TreeSet, казалось, идеально подходил, так как он сортирует и убивает дубликаты. Моя проблема в том, что я запутался в том, как вернуть только первые три элемента. Кажется, что итератор проходит весь набор. Создание цикла while с ручным итератором, содержащего цикл while, который содержит циклы итератора, кажется сбивающим с толку и вряд ли будет успешным. Есть ли здесь ответ, что мне нужно перебрать набор деревьев и поместить каждый элемент в массив, чтобы я мог получить доступ к первым трем элементам? Я имею в виду, кажется, что это будет работать, но это кажется очень запутанным. Советы?

Ответы [ 5 ]

3 голосов
/ 06 мая 2011

Используя Гуава вы можете просто сделать

return Lists.newArrayList(Iterables.limit(treeSet, 3));
2 голосов
/ 06 мая 2011

Hm. Что не так с очевидным?

ArrayList<MyType> buffer = new ArrayList<MyType>(3); 

for( MyType elt: myTreeSet ) {

    buffer.add(elt);
    if( buffer.size() == 3 ) break;
}

Или

ArrayList<MyType> buffer = new ArrayList<MyType>(3);
Iterator<MyType> iter = myTreeSet.iterator();

while( iter.hasNext() && buffer.size() < 3 ) buffer.add(iter.next());

если вы предпочитаете "desugared" версию?

1 голос
/ 06 мая 2011

Я бы использовал (ожидая, что вы используете Java 1.6):

Arrays.copyOf(myTreeSet.toArray(), Math.min(3, myTreeset.size()));

Редактировать : быть пуленепробиваемым с добавленным размером Math.min()

1 голос
/ 06 мая 2011

Пример со строками:

TreeSet<String> treeSet = new TreeSet<String>(); 

// you populate treeSet with data

String[] stringArray = new String[NUMBER_OF_NEEDED_RECORDS];
for(int i =0; i < NUMBER_OF_NEEDED_RECORDS; i++) {
    stringArray[i] = treeSet.pollFirst();
}
0 голосов
/ 13 августа 2013
TreeSet<String> tree = new TreeSet<String>();
// fill the tree set
String[] stringArray = new String[tree.size()];
tree.toArray(stringArray);

Мне кажется, это намного проще.Полезно то, что метод toArray(T[] a) принимает универсальный параметр массива, который помогает вам указать практически любой тип массива, который вы хотите, который соответствует данным в TreeSet<>.

...