Как извлечь уникальные поля из ArrayList объектов?

Вопрос: Хорошо, я ударился головой об этом вопросе. Я чувствую, что решение может быть простым, но я в замешательстве. Вот оно: У меня есть ArrayList объектов типа DbConnection. Каждый объект DbConnection имеет имя fields- DbName, SchemaName, AppId, Host, OsUser Например. строки выборки: Схема базы данных ApplId Host OsUser СИСТЕМА EGPRD AAA dh7y7hdu oracle EGPRD SYSTEM

Вопрос:

Хорошо, я ударился головой об этом вопросе. Я чувствую, что решение может быть простым, но я в замешательстве. Вот оно:

У меня есть 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), поэтому в таблицу базы данных будут вставлены уникальные комбинации.

Ответ №1

Если вы хотите извлекать уникальные поля, вам нужно создать функцию, которая проходит через ваш список, элемент за пунктом и проверяет, есть ли какой-либо элемент, который “равен” тому, который вы сейчас используете.

(Вам также нужно пропустить тот, который указан в том же индексе списка)

for (i = 0; i < list.size(); ++i) { for (j = 0; i < list.size(); ++j) { if (list[i] == list[j] && i != j) { // Do your stuff here. } } }

Вы можете перегрузить оператор ‘==’, если это пользовательский класс, или вы можете просто проверить один атрибут, например имя и т.д.

if (list[i].requestID == list[j].requestID && i != j) { … Ответ №2

Вот ваш класс 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 { ArrayList<DbConnection> arrayList = 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<DbConnection> 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() + » : «); } } Ответ №3

Я думаю, вам понравится это…

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»); List<DbConnection> dcList = 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 } } Ответ №4

Вы можете использовать TreeSet для удаления дублетов, псевдокода:

TreeSet<DbConnection> 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 }

Оцените статью
Добавить комментарий