Получите уникальные значения из arraylist в java - программирование
Подтвердить что ты не робот

Получите уникальные значения из arraylist в java

У меня есть ArrayList с несколькими записями, а один столбец содержит названия газов как CO2 CH4 SO2 и т.д. Теперь я хочу получить разные названия газов (уникальные) только без повторения с ArrayList. Как это можно сделать?

4b9b3361

Ответ 1

Вы должны использовать Set. Set - это коллекция, которая не содержит дубликатов.

Если у вас есть List, который содержит дубликаты, вы можете получить уникальные записи, например:

List<String> gasList = // create list with duplicates...
Set<String> uniqueGas = new HashSet<String>(gasList);
System.out.println("Unique gas count: " + uniqueGas.size());

ПРИМЕЧАНИЕ: этот конструктор HashSet идентифицирует дубликаты, вызывая методы equals() элементов.

Ответ 2

Вы можете использовать Java 8 Stream API.

Метод Different - это промежуточная операция, которая фильтрует поток и позволяет только отдельным значениям (по умолчанию, используя метод Object :: equals) перейти к следующей операции.
Я написал пример ниже для вашего случая,

// Create the list with duplicates.
List<String> listAll = Arrays.asList("CO2", "CH4", "SO2", "CO2", "CH4", "SO2", "CO2", "CH4", "SO2");

// Create a list with the distinct elements using stream.
List<String> listDistinct = listAll.stream().distinct().collect(Collectors.toList());

// Display them to terminal using stream::collect with a build in Collector.
String collectAll = listAll.stream().collect(Collectors.joining(", "));
System.out.println(collectAll); //=> CO2, CH4, SO2, CO2, CH4 etc..
String collectDistinct = listDistinct.stream().collect(Collectors.joining(", "));
System.out.println(collectDistinct); //=> CO2, CH4, SO2

Ответ 3

Надеюсь, я правильно понял ваш вопрос: считая, что значения имеют тип String, наиболее эффективным способом, вероятно, является преобразование в HashSet и итерация по нему:

ArrayList<String> values = ... //Your values
HashSet<String> uniqueValues = new HashSet<>(values);
for (String value : uniqueValues) {
   ... //Do something
}

Ответ 4

Здесь прямолинейно, не прибегая к обычным компараторам или тому подобному:

Set<String> gasNames = new HashSet<String>();
List<YourRecord> records = ...;

for(YourRecord record : records) {
  gasNames.add(record.getGasName());
}

// now gasNames is a set of unique gas names, which you could operate on:
List<String> sortedGasses = new ArrayList<String>(gasNames);
Collections.sort(sortedGasses);

Примечание. Использование TreeSet вместо HashSet даст непосредственно отсортированный arraylist и выше Collections.sort может быть пропущен, но TreeSet в противном случае менее эффективен, поэтому часто лучше и редко хуже использовать HashSet даже при сортировке.

Ответ 5

ArrayList values = ... // your values
Set uniqueValues = new HashSet(values); //now unique

Ответ 6

Если у вас есть массив какого-либо объекта (bean), вы можете сделать это:

List<aBean> gasList = createDuplicateGasBeans();
Set<aBean> uniqueGas = new HashSet<aBean>(gasList);

как сказано выше, Mathias Schwarz, но вы должны предоставить свой aBean методы hashCode() и equals(Object obj), которые можно легко выполнить в Eclipse по выделенному меню "Generate hashCode() and equals()" (в то время как в классе bean), Set будет оценивать переопределенные методы для выделения равных объектов.

Ответ 7

  @SuppressWarnings({ "unchecked", "rawtypes" })
    public static List getUniqueValues(List input) {
    return new ArrayList<>(new HashSet<>(input));
    }

не забудьте реализовать метод equals

Ответ 8

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

Вот решение, когда нужно получить список уникальных объектов, а НЕ строк. Допустим, у каждого есть список объекта Record. Класс Record имеет только свойства типа String, НЕТ свойства типа int. Здесь реализация hashCode() становится трудной, поскольку hashCode() необходимо вернуть int.

Ниже приведен пример класса Record.

public class Record{

    String employeeName;
    String employeeGroup;

    Record(String name, String group){  
        employeeName= name;
        employeeGroup = group;    
    }
    public String getEmployeeName(){
        return employeeName;
    }
    public String getEmployeeGroup(){
        return employeeGroup;
    }

  @Override
    public boolean equals(Object o){
         if(o instanceof Record){
            if (((Record) o).employeeGroup.equals(employeeGroup) &&
                  ((Record) o).employeeName.equals(employeeName)){
                return true;
            }
         }
         return false;
    }

    @Override
    public int hashCode() { //this should return a unique code
        int hash = 3; //this could be anything, but I would chose a prime(e.g. 5, 7, 11 )
        //again, the multiplier could be anything like 59,79,89, any prime
        hash = 89 * hash + Objects.hashCode(this.employeeGroup); 
        return hash;
    }

Как предлагалось ранее другими, класс должен переопределить как метод equals(), так и метод hashCode(), чтобы иметь возможность использовать HashSet.

Теперь, скажем, список записей allRecord (List<Record> allRecord).

Set<Record> distinctRecords = new HashSet<>();

for(Record rc: allRecord){
    distinctRecords.add(rc);
}

Это добавит только отдельные записи в Hashset, отдельный записи.

Надеюсь это поможет.

Ответ 9

Вы можете использовать это для составления списка уникальных

ArrayList<String> listWithDuplicateValues = new ArrayList<>();
list.add("first");
list.add("first");
list.add("second");

ArrayList uniqueList = (ArrayList) listWithDuplicateValues.stream().distinct().collect(Collectors.toList());