У меня есть ArrayList
с несколькими записями, а один столбец содержит названия газов как CO2 CH4 SO2 и т.д. Теперь я хочу получить разные названия газов (уникальные) только без повторения с ArrayList
. Как это можно сделать?
Получите уникальные значения из arraylist в java
Ответ 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());