![](/img/trans.png)
[英]How to extract elements from arraylist of objects which is having same category?
[英]How to extract unique fields from an ArrayList of objects?
好吧,我一直在想这个问题。 我觉得解决方案可能很简单,但我很困惑。 开始:
我有一个ArrayList类型的对象DbConnection 。 每个DbConnection对象都具有以下字段-DbName,SchemaName,AppId,Host,OsUser
例如。 样本行:
数据库架构ApplId主机OsUser
EGPRD系统AAA dh7y7hdu甲骨文
EGPRD系统AAA d6f7d6fd Linux
EGPRD ADM RDA d6f7d6fd linux
SOPRD DBLINK ACT fdf7f87e8甲骨文
根据应用程序,此ArrayList可以具有大约1000个上述对象。 现在,我要从此ArrayList中提取具有特定应用程序ID /数据库/架构组合的那些行,并将其写入数据库中的表中(该表具有字段database,schema,applId)。 它应该从arraylist中提取该信息并保存在表中。
因此,当插入唯一行时,该表将如下所示:
请求ID数据库架构ApplId
1234 EGPRD系统AAA
1234 EGPRD ADM RDA
1234 SOPRD DBLINK ACT
1234是在其他表中更新所有1000行时生成的请求ID。
如何从对象数组列表中选择值的唯一组合? 我的意思是每个对象都有许多字段(db,schema,appid,host,osuser),但是我只需要三个组合(db,schema,appid),因此唯一的组合将插入数据库表中。
如果要提取唯一字段,则需要创建一个函数,该函数逐项遍历列表 ,并检查是否有任何项与您当前使用的项“相等”。
(您还需要跳过列表相同索引上的一个)
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) { ...
这是您的DbConnection类。 您必须重写equal方法,以检查每个元素是否相等。 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;
}
}
主要方法:首先将所有元素插入数组列表,然后创建另一个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() + " : ");
}
}
我想你会喜欢...
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,则可以使用继承的或包装器。
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<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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.