Преобразование LinkedHashSet в ArrayList или просто использование ArrayList - PullRequest
0 голосов
/ 30 декабря 2018

Рассмотрим следующий код:

final Set<String> allPaths = new HashSet<String>();
for (final String path: paths) {
        allPaths.add(path);
}
final MyData d = new MyData(new ArrayList<String>(allPaths));

MyData - это класс, который я не должен касаться.Он должен получить ArrayList в качестве аргумента.До этого дня мы использовали этот способ, потому что нас не заботил порядок, поэтому мы использовали Set (поэтому дублирования не будет).Но теперь я хотел бы сохранить порядок элементов, поэтому после некоторых исследований я обнаружил, что для этого могу использовать структуру данных LinkedHashSet.Итак, я сделал:

final LinkedHashSet<String> allPaths = new LinkedHashSet<String>();
for (final String path: paths) {
        allPaths .add(path);
}
final MyData d = new MyData(new ArrayList<String>(allPaths));

Проблема в том, что я не уверен, как конвертировать LinkedHashSet в ArrayList.Кроме того, я подумал об использовании ArrayList вместо LinkedHashSet, поэтому мне не придется преобразовывать его, но мне придется перебирать массив (O(n)).

Что хорошо, чистои эффективный способ я должен использовать?

Ответы [ 4 ]

0 голосов
/ 30 декабря 2018

Если paths является коллекцией, вы можете получить список массивов без дубликатов:

ArrayList<String> p = paths.stream().distinct().collect(Collectors.toCollection(ArrayList::new));

Если paths является массивом:

ArrayList<String> p = Stream.of(paths).distinct().collect(Collectors.toCollection(ArrayList::new));

0 голосов
/ 30 декабря 2018

Почему бы вам просто не преобразовать paths в LinkedHashSet, как это (при условии, что paths - это коллекция?

final MyData d = new MyData(new ArrayList<>(new LinkedHashSet<>(paths)));

В случае, если paths - это массив, вы можете использоватьArrays.asList(paths) внутри преобразования выше

0 голосов
/ 30 декабря 2018
@TTaJTa4 you can use the code below as an example. Both ways are fine.



import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

public class ConvertLinkedHashSetToArrayList
{

  public static void main(String[] args)
  {
    Set<String> testStrings = new LinkedHashSet<>();
    testStrings.add("String 1");
    testStrings.add("String 2");
    testStrings.add("String 3");
    testStrings.add("String 4");
    testStrings.add("String 5");

    System.out.println("** Printing LinkedHashSet: " + testStrings);
    ArrayList<String> linkedHashSetToArrayList1 = new ArrayList<>(testStrings);
    System.out.println("** Printing linkedHashSetToArrayList1:" + 
    linkedHashSetToArrayList1);

    ArrayList<String> linkedHashSetToArrayList2 = new ArrayList<>();
    linkedHashSetToArrayList2.addAll(testStrings);
    System.out.println("** Printing linkedHashSetToArrayList2:" + 
    linkedHashSetToArrayList2);
  }
}

Результаты выглядят так:

** Printing LinkedHashSet: [String 1, String 2, String 3, String 4, String 5]
** Printing linkedHashSetToArrayList1:[String 1, String 2, String 3, String 4, String 5]
** Printing linkedHashSetToArrayList2:[String 1, String 2, String 3, String 4, String 5]

Перейдите по ссылке GitHub для полного проекта Java: Пример GitHub

0 голосов
/ 30 декабря 2018

Просто используйте метод public boolean addAll(Collection<? extends E> c), в arrayList он принимает любые Collection.

У вас есть LinkedHashSet:

final LinkedHashSet<String> allPaths = new LinkedHashSet<String>();
for (final String path: paths) {
        allPaths .add(path);
}

и затем вы можете (вы можетеиспользуйте это, даже если mylist не пусто):

List<String> myList = new ArrayList<>();
mylist.addAll(allPaths);

или для еще более простого подхода:

List<String> myList = new ArrayList<>(allPaths);
...