Java 如何从对象的ArrayList中提取唯一字段?
好吧,我一直在为这个问题绞尽脑汁。我觉得解决办法可能很简单,但我感到困惑。下面是: 我有一个类型为DbConnection的对象数组列表。每个DbConnection对象都有字段-DbName、SchemaName、AppId、Host、OsUser 示例行: 数据库架构ApplId主机OsUserJava 如何从对象的ArrayList中提取唯一字段?,java,collections,Java,Collections,好吧,我一直在为这个问题绞尽脑汁。我觉得解决办法可能很简单,但我感到困惑。下面是: 我有一个类型为DbConnection的对象数组列表。每个DbConnection对象都有字段-DbName、SchemaName、AppId、Host、OsUser 示例行: 数据库架构ApplId主机OsUser EGPRD系统AAA dh7y7hdu oracle EGPRD系统AAA d6f7d6fd linux EGPRD ADM RDA d6f7d6fd linux SOPRDDBLINKACTfd
EGPRD系统AAA dh7y7hdu oracle
EGPRD系统AAA d6f7d6fd linux
EGPRD ADM RDA d6f7d6fd linux
SOPRDDBLINKACTfdf7f87e8oracle 根据应用程序的不同,此ArrayList可以包含大约1000个类似于上述的对象。现在,从这个ArrayList中,我想提取那些属于特定app id/数据库/模式组合的行,并将其写入数据库中的一个表(表中有database、schema、applId字段)。它应该从arraylist中提取该信息并保存在表中 因此,当插入唯一行时,该表将如下所示: 请求Id数据库架构ApplId
1234 EGPRD系统AAA
1234EGPRD ADM RDA
1234 SOPRDDBLINKACT
1234是在其他一些表中更新所有1000行时生成的请求id
如何从对象的arraylist中选择唯一的值组合?我的意思是每个对象都有许多字段(db、schema、appid、host、osuser),但我只需要三个组合(db、schema、appid),因此将在数据库表中插入唯一的组合。如果要提取唯一字段,需要创建一个函数,逐项遍历列表,并检查是否有任何项目与您当前使用的项目“相等” (您还需要跳过列表中同一索引上的索引)
这是您的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() + " : ");
}
}
publicstaticvoidmain(字符串[]args)引发IOException{
ArrayList ArrayList=新的ArrayList();
添加(新的数据库连接(“EGPRD”、“系统”、“AAA”、“dh7y7hdu”、“oracle”);
添加(新的数据库连接(“EGPRD”、“系统”、“AAA”、“d6f7d6fd”、“linux”);
添加(新的数据库连接(“EGPRD”、“ADM”、“RDA”、“dh7y7hdu”、“linux”);
添加(新的数据库连接(“SOPRD”、“DBLINK”、“ACT”、“fdf7f87e8”、“oracle”);
ArrayList newList=新的ArrayList();
for(数据库连接数据库连接:arrayList){
if(newList.isEmpty()){
添加(dbConnection);
}否则{
布尔存在状态=false;
对于(DbConnection newSingleElement:newList){
if(newSingleElement.equals(dbConnection)){
存在状态=真;
打破
}
}
如果(!存在状态){
添加(dbConnection);
}
}
}
用于(数据库连接数据库连接:新建列表){
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;
}
您可以使用TreeSet删除doublets,伪代码:
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
}
TreeSet set=newtreeset((l,m)->(l.getSchema()+l.getdabase()).compareTo(m.getSchema()+l.getDatabase()+…);
用于(数据库连接项:列表){
如果(/*条件*/){
设置。添加(项目);
}
}
用于(数据库连接项:设置){
//添加到数据库
}
覆盖DbConnection的equals方法,并将每个DbConnection插入一个集合。您需要一个问题才能找到解决方案。请查看堆栈溢出问题清单,然后相应地重新格式化您的问题:我删除了JDBC标记,因为您的问题与JDBC的使用无关;它提到一个数据库或可能最终用于引用一个数据库,这一事实不足以作为使用JDBC标记的理由。只标记与问题相关的内容。
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;
}
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<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
}