如何将列表对象复制为指向原始对象的指针
How to copy List object as pointer to original object
我对 Java 还很陌生,所以我希望我能正确解释这个场景。
我正在尝试复制一个 List 对象,但希望我的第二个副本指向与第一个 List 对象相同的对象。我需要两个副本的唯一原因是我需要独立地遍历每个副本。我试图找到一种方法,甚至问过几个同事,但唯一有效的方法是一起创建另一个对象。
非常感谢任何帮助。
谢谢,
克里斯汀
更新:这是我正在尝试做的一个例子:
这是我目前声明列表的方式:
List monetaryTransactions = null;
//make a copy of the monetary trans list for use when info is needed about a parent transaction
List parentMonetaryTransactions = new ArrayList(monetaryTransactions);
And this is how I'm using them:
//THE monetaryTransactions LIST IS POPULATED AND THEN.....
//loop through the monetary transactions list
for (Iterator iter = monetaryTransactions.iterator(); iter.hasNext();) {
monetaryTransaction = (IMonetaryTransaction) iter.next();
.....
//if there is a parent transaction get info about that transaction
if ( monetaryTransaction.getParentBillingTransactionId() != null) {
//get the parent billing trans id of the current monetary transaction
parentBillingTransId = monetaryTransaction.getParentBillingTransactionId();
IT'S THIS SECOND SORT AND ITERATION THAT I NEED TO MAKE SURE DOES NOT AFFECT MY OUTTER LOOP'S ITERATION
Collections.sort(parentMonetaryTransactions, new MonetaryTransactionOriginalProcessDateDescOrderComparator());
//loop through parent monetary trans list to find the parent transaction
for (Iterator iter2 = parentMonetaryTransactions.iterator(); iter2.hasNext();) {
parentMonetaryTransaction = (IMonetaryTransaction) iter2.next();
.......
}
}
}
您对列表的变量引用可以被认为是指向该对象实例的指针。因此,您可以创建任意数量的指向列表的指针。
List<String> list = new ArrayList<>();
List<String> anotherPointer = list;
现在任何带有引用 list
和 anotherPointer
的内容都会反映在对象本身上。
list.add("Hello");
System.out.println(anotherPointer.size()); //Prints 1
如果您不想创建另一个 List
对象,您可以使用两个 int
变量和 get(int index)
函数来访问不同索引处的 List
.
注意这段代码会抛出 NullPointerException:
List monetaryTransactions = null;
//make a copy of the monetary trans list for use when info is needed about a parent transaction
List parentMonetaryTransactions = new ArrayList(monetaryTransactions);
再往下说,为什么还要对列表进行排序和迭代呢?每个 IMonetaryTransaction
是否有多个 parent,具有不同的原始处理日期?不同的交易是否共享相同的 ID?
如果您有权访问 IMonetaryTransaction
来源,保留对 parent 交易本身的引用而不是仅存储 ID 会更清晰。例如
interface IMonetaryTransaction {
// This...
IMonetaryTransaction getParentBillingTransaction();
// ...rather than this
long getParentBillingTransactionId();
}
但是如果你不能改变这个模型,并且只有一个所有交易的简单列表,parents 与 children 混合在一起,它可能更容易(也更有效)按 ID 创建交易地图:
Map<Long, IMonetaryTransaction> transactions = new HashMap<>();
monetaryTransactions.forEach(txn -> transactions.put(txn.getId(), txn);
这样当您需要获取给定交易的 parent 时,您只需要这样做而不是再次遍历整个列表。
IMonetaryTransaction parent = transactions.get(txn. getParentBillingTransactionId());
我对 Java 还很陌生,所以我希望我能正确解释这个场景。
我正在尝试复制一个 List 对象,但希望我的第二个副本指向与第一个 List 对象相同的对象。我需要两个副本的唯一原因是我需要独立地遍历每个副本。我试图找到一种方法,甚至问过几个同事,但唯一有效的方法是一起创建另一个对象。
非常感谢任何帮助。
谢谢, 克里斯汀
更新:这是我正在尝试做的一个例子:
这是我目前声明列表的方式:
List monetaryTransactions = null;
//make a copy of the monetary trans list for use when info is needed about a parent transaction
List parentMonetaryTransactions = new ArrayList(monetaryTransactions);
And this is how I'm using them:
//THE monetaryTransactions LIST IS POPULATED AND THEN.....
//loop through the monetary transactions list
for (Iterator iter = monetaryTransactions.iterator(); iter.hasNext();) {
monetaryTransaction = (IMonetaryTransaction) iter.next();
.....
//if there is a parent transaction get info about that transaction
if ( monetaryTransaction.getParentBillingTransactionId() != null) {
//get the parent billing trans id of the current monetary transaction
parentBillingTransId = monetaryTransaction.getParentBillingTransactionId();
IT'S THIS SECOND SORT AND ITERATION THAT I NEED TO MAKE SURE DOES NOT AFFECT MY OUTTER LOOP'S ITERATION
Collections.sort(parentMonetaryTransactions, new MonetaryTransactionOriginalProcessDateDescOrderComparator());
//loop through parent monetary trans list to find the parent transaction
for (Iterator iter2 = parentMonetaryTransactions.iterator(); iter2.hasNext();) {
parentMonetaryTransaction = (IMonetaryTransaction) iter2.next();
.......
}
}
}
您对列表的变量引用可以被认为是指向该对象实例的指针。因此,您可以创建任意数量的指向列表的指针。
List<String> list = new ArrayList<>();
List<String> anotherPointer = list;
现在任何带有引用 list
和 anotherPointer
的内容都会反映在对象本身上。
list.add("Hello");
System.out.println(anotherPointer.size()); //Prints 1
如果您不想创建另一个 List
对象,您可以使用两个 int
变量和 get(int index)
函数来访问不同索引处的 List
.
注意这段代码会抛出 NullPointerException:
List monetaryTransactions = null;
//make a copy of the monetary trans list for use when info is needed about a parent transaction
List parentMonetaryTransactions = new ArrayList(monetaryTransactions);
再往下说,为什么还要对列表进行排序和迭代呢?每个 IMonetaryTransaction
是否有多个 parent,具有不同的原始处理日期?不同的交易是否共享相同的 ID?
如果您有权访问 IMonetaryTransaction
来源,保留对 parent 交易本身的引用而不是仅存储 ID 会更清晰。例如
interface IMonetaryTransaction {
// This...
IMonetaryTransaction getParentBillingTransaction();
// ...rather than this
long getParentBillingTransactionId();
}
但是如果你不能改变这个模型,并且只有一个所有交易的简单列表,parents 与 children 混合在一起,它可能更容易(也更有效)按 ID 创建交易地图:
Map<Long, IMonetaryTransaction> transactions = new HashMap<>();
monetaryTransactions.forEach(txn -> transactions.put(txn.getId(), txn);
这样当您需要获取给定交易的 parent 时,您只需要这样做而不是再次遍历整个列表。
IMonetaryTransaction parent = transactions.get(txn. getParentBillingTransactionId());