Как извлечь уникальные поля из ArrayList объектов?
Хорошо, я ударился головой об этом вопросе. Я чувствую, что решение может быть простым, но я в замешательстве. Вот оно:
У меня есть ArrayList объектов типа DbConnection. Каждый объект DbConnection имеет имя fields- DbName, SchemaName, AppId, Host, OsUser
Схема базы данных ApplId Host OsUser
СИСТЕМА EGPRD AAA dh7y7hdu oracle
EGPRD SYSTEM AAA d6f7d6fd linux
EGPRD ADM RDA d6f7d6fd linux
SOPRD DBLINK ACT fdf7f87e8 oracle
Этот ArrayList может иметь около 1000 объектов, как указано выше в соответствии с приложением. Теперь из этого массива ArrayList я хочу извлечь те строки, которые имеют конкретную комбинацию id/database/schema приложения, и записать их в таблицу в базе данных (таблица имеет базу данных полей, схему, applId). Он должен извлечь эту информацию из архивариуса и сохранить в таблице.
Таким образом, эта таблица будет выглядеть так, когда будут вставлены уникальные строки:
Применение схемы базы данных идентификатора запроса ApplId
1234 EGPRD SYSTEM AAA
1234 EGPRD ADM RDA
1234 SOPRD DBLINK ACT
1234 – это идентификатор запроса, который был сгенерирован, когда все 1000 строк были обновлены в какой-либо другой таблице.
Как выбрать уникальную комбинацию значений от аррайалиста объектов? Я имею в виду, что у каждого объекта есть много полей (db, schema, appid, host, osuser), но мне нужно всего три комбинации (db, schema, appid), поэтому в таблицу базы данных будут вставлены уникальные комбинации.
Если вы хотите извлекать уникальные поля, вам нужно создать функцию, которая проходит через ваш список, элемент за пунктом и проверяет, есть ли какой-либо элемент, который “равен” тому, который вы сейчас используете.
(Вам также нужно пропустить тот, который указан в том же индексе списка)
Вы можете перегрузить оператор ‘==’, если это пользовательский класс, или вы можете просто проверить один атрибут, например имя и т.д.
if (list[i].requestID == list[j].requestID && i != j) < .
Вот ваш класс DbConnection. Вы должны переписать равный метод, чтобы проверить, что каждый элемент равен или нет. DbConnection.java
public class DbConnection < private String DbName; private String SchemaName; private String ApplId; private String Host; private String OsUser; public DbConnection(String DbName, String SchemaName, String ApplId, String Host, String OsUser) < this.DbName = DbName; this.SchemaName = SchemaName; this.ApplId = ApplId; this.Host = Host; this.OsUser = OsUser; >public String getDbName() < return DbName; >public String getSchemaName() < return SchemaName; >public String getApplId() < return ApplId; >public String getHost() < return Host; >public String getOsUser() < return OsUser; >@Override public boolean equals(Object obj) < if (obj instanceof DbConnection) < DbConnection dbConnection = (DbConnection) obj; if (this.ApplId.equals(dbConnection.getApplId()) && this.DbName.equals(dbConnection.getDbName()) && this.SchemaName.equals(dbConnection.getSchemaName())) < return true; >> return false; > >
Main Mathod: сначала вставьте весь элемент в список массивов и создайте еще один arraylist, в котором вы храните весь свой уникальный элемент. Затем повторите первый список и проверьте, что первый список уже существует или нет в уникальном списке. Если этого не существует, добавьте этот элемент в уникальный список.
public static void main(String[] args) throws IOException < ArrayListarrayList = new ArrayList<>(); arrayList.add(new DbConnection("EGPRD", "SYSTEM", "AAA", "dh7y7hdu", "oracle")); arrayList.add(new DbConnection("EGPRD", "SYSTEM", "AAA", "d6f7d6fd", "linux")); arrayList.add(new DbConnection("EGPRD", "ADM", "RDA", "dh7y7hdu", "linux")); arrayList.add(new DbConnection("SOPRD", "DBLINK", "ACT", "fdf7f87e8", "oracle")); ArrayList newList = new ArrayList<>(); for (DbConnection dbConnection : arrayList) < if (newList.isEmpty()) < newList.add(dbConnection); >else < boolean existenceStatus = false; for (DbConnection newSingleElement : newList) < if (newSingleElement.equals(dbConnection)) < existenceStatus = true; break; >> if(!existenceStatus) < newList.add(dbConnection); >> > for (DbConnection dbConnection : newList) < System.out.println(dbConnection.getDbName() + " : " + dbConnection.getSchemaName() + " : " + dbConnection.getApplId() + " : "); >>
Я думаю, вам понравится это…
import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; public class Exam < public static void main(String[] args) < DbConnection dc1 = new DbConnection("EGPRD","SYSTEM","AAA","dh7y7hdu", "oracle"); DbConnection dc2 = new DbConnection("EGPRD","SYSTEM","AAA","d6f7d6fd", "linux"); DbConnection dc3 = new DbConnection("EGPRD","ADM","RDA","d6f7d6fd", "linux"); DbConnection dc4 = new DbConnection("SOPRD","DBLINK","ACT","fdf7f87e8", "oracle"); ListdcList = new ArrayList(4); dcList.add(dc1); dcList.add(dc2); dcList.add(dc3); dcList.add(dc4); Map uniqueTable = new Hashtable(); for( DbConnection fDc : dcList ) < uniqueTable.put(fDc.key, fDc); >for( Iterator it = uniqueTable.keySet().iterator();it.hasNext(); ) < DbConnection mDc = (DbConnection)uniqueTable.get(it.next()); System.out.println( "1234" + "\t"+ mDc.DbName + "\t" + mDc.SchemaName + "\t" + mDc.AppId); >> > class DbConnection < public DbConnection(String dbName, String schemaName, String appId, String host, String osUser) < super(); DbName = dbName; SchemaName = schemaName; AppId = appId; Host = host; OsUser = osUser; key = DbName + SchemaName + AppId; // key generation >public String key; public String DbName; public String SchemaName; public String AppId; public String Host; public String OsUser; >
Если вы не можете изменить Db Connection guess, вы можете использовать унаследованные или обертки.
class DbConnectionEx extends DbConnection < public String key; public DbConnectionEx(String dbName, String schemaName, String appId, String host, String osUser) < super(dbName, schemaName, appId, host, osUser); key = DbName + SchemaName + AppId; // key generation >>
Вы можете использовать TreeSet для удаления дублетов, псевдокода:
TreeSet set= new TreeSet<>((l, m) -> (l.getSchema() +l.getDababase(). ).compareTo(m.getSchema() + l.getDatabase()+ . )); for (DbConnection item : list) < if (/*condition*/) < set.add(item); >> for (DbConnection item : set) < //add to db >
Получить уникальные значения от arraylist в Java
У меня есть ArrayList с несколькими записями, а один столбец содержит названия газов как CO2 CH4 SO2 и т.д. Теперь я хочу получить разные названия газов (уникальные) только без повторения с ArrayList . Как это можно сделать?
6 ответов
A Set - это Collection, который не содержит дубликатов.
Если у вас есть List, который содержит дубликаты, вы можете получить уникальные записи, подобные этому:
List gasList = // create list with duplicates. Set uniqueGas = new HashSet(gasList); System.out.println("Unique gas count: " + uniqueGas.size());
ПРИМЕЧАНИЕ. Этот конструктор HashSet идентифицирует дубликаты, вызывая методы equals() элементов.
@njzk2 njzk2 - Я подумал, что это было бы довольно очевидно, но, думаю, я могу отредактировать, чтобы указать на это явно .
Я получаю сообщение об ошибке при попытке реализовать приведенный выше код: java: no suitable constructor found for HashSet . Есть идеи, почему это происходит?
Вы можете использовать Java 8 Stream API.
Метод distinct - это промежуточная операция, которая фильтрует поток и позволяет использовать только distict-значения (по умолчанию с использованием метода Object:: equals) для перехода к следующей операции.
Я написал пример ниже для вашего случая,
// Create the list with duplicates. List listAll = Arrays.asList("CO2", "CH4", "SO2", "CO2", "CH4", "SO2", "CO2", "CH4", "SO2"); // Create a list with the distinct elements using stream. List 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
Надеюсь, я правильно понял ваш вопрос: считая, что значения имеют тип String , наиболее эффективным способом, вероятно, является преобразование в HashSet и итерация по нему:
ArrayList values = . //Your values HashSet uniqueValues = new HashSet<>(values); for (String value : uniqueValues) < . //Do something >
ArrayList values = . // your values Set uniqueValues = new HashSet(values); //now unique
Теперь я получаю уникальные элементы из списка, но он сортируется сам по себе. Но мне нужно, чтобы данные не были в отсортированном порядке. Как это можно сделать?
Здесь прямолинейно, не прибегая к обычным компараторам или тому подобному:
Set gasNames = new HashSet(); List records = . ; for(YourRecord record : records) < gasNames.add(record.getGasName()); >// now gasNames is a set of unique gas names, which you could operate on: List sortedGasses = new ArrayList(gasNames); Collections.sort(sortedGasses);
Примечание. Использование TreeSet вместо HashSet даст непосредственно отсортированный arraylist и выше Collections.sort может быть пропущен, но TreeSet в противном случае менее эффективен, поэтому часто лучше и редко хуже использовать HashSet даже при сортировке.
Если у вас есть массив какого-либо объекта (bean), вы можете сделать это:
List gasList = createDuplicateGasBeans(); Set uniqueGas = new HashSet(gasList);
как сказано выше, Mathias Schwarz, но вы должны предоставить свой aBean методы hashCode() и equals(Object obj) , которые можно легко выполнить в Eclipse по выделенному меню " Generate hashCode() and equals() " (в то время как в классе bean), Set будет оценивать переопределенные методы для выделения равных объектов.
Ещё вопросы
- 0 HTML с использованием DIV и таблицы
- 0 Установка высоты абсолютно позиционированного элемента div по высоте его содержимого
- 0 Рекурсивно отформатировать объект
- 0 Как получить дескриптор окна виджета для передачи в win32 api MessageBox в Qt
- 1 Hibernate встраиваемое отображение списка с идентификатором
- 1 Выберите размер изображения в намерении камеры
- 1 Реализация шаблона фабричного дизайна в rt.jar
- 0 Скачать файл с URL как вложение
- 1 Насмешливые функции, полученные из метода __getattr__
- 1 Как скопировать файл из папки в другую папку с помощью Windows Service C #
- 1 Как офлайн произнести английское слово в программировании Android?
- 1 Конвертировать PNG-изображение в BLOB-изображение с помощью JavaScript?
- 0 MySQL меняет уникальный ключ на основной (mariadb)
- 1 Отправить письмо программно
- 1 запустить команду python с псевдонимом в командной строке, например, npm
- 0 Программа C ++ не будет собираться. Получение неопределенных символов для ошибки архитектуры
- 0 Как определить пользовательскую метрику в Apache Superset?
- 0 Вызовите PHP с JavaScript
- 0 Получить идентификатор отмеченных флажков в списке одним нажатием кнопки
- 1 Остановить RegEx каждый раз, когда находит определенную строку
- 0 AngularFire & Ionic - форма данных не передается на сервер
- 0 Замените тег другим тегом
- 0 Использование функции в качестве параметра в контроллере
- 1 SUM () в SQL для LINQ
- 0 выбирая только записи, которых нет во второй таблице
- 0 удалить элемент из локального хранилища
- 0 g ++: CreateProcess: нет такого файла или каталога [дубликата]
- 1 Не удается правильно прочитать словарь, сохраненный как файл json
- 1 Обрабатывать всплывающее окно JavaScript внутри div
- 1 Регулярные выражения для добавления классов в HTML-теги
- 0 AngularJS не отправляет данные через POST
- 1 NancyFx не может найти ссылку на NewtonSoft в Razor View Engine
- 1 Определить, находится ли текущее время в нескольких временных диапазонах
- 1 C # добавление в список кортежей с функцией
- 0 Отправить текст вместе с изображением в WhatsApp API
- 1 рисование ограничительной рамки на больших изображениях
- 1 Метеор выполняет функции синхронно
- 1 Не удается создать узел cq, когда включен компонент CQ5
- 1 Удаление несистемного приложения с использованием оболочки ADB на устройстве Android
- 1 Модульная экспонента в Java (алгоритм дает неправильный ответ)
- 1 Javascript, имя функции с интерполяцией строк [дубликаты]
- 1 Recyclerview не обновляет список данных
- 1 Изображение не загружается на JTable
- 0 Как получить метку времени из строки даты с часовым поясом, PHP?
- 0 Добавление коробки количества к списку товаров magento
- 0 Doxygen ничего не выводит
- 0 Почему мы не можем объявить две переменные в цикле for?
- 1 Чистое разделение вида и кода с помощью Vue с использованием шаблонов
- 1 Полиморфная рассылка примитивных типов в питоне?
- 1 Добавить кнопку в верхней части макета кадра