我对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();
.......
}
}
}
答案 0 :(得分:1)
您对列表的变量引用可以被视为指向该对象实例的指针。因此,您可以创建任意数量的指向列表的指针。
List<String> list = new ArrayList<>();
List<String> anotherPointer = list;
现在,您使用引用list
和anotherPointer
的任何内容都会反映出对象本身。
list.add("Hello");
System.out.println(anotherPointer.size()); //Prints 1
答案 1 :(得分:0)
如果您不想创建另一个List
对象,则可以使用两个int
变量以及get(int index)
函数来访问不同索引处的List
。< / p>
答案 2 :(得分:0)
请注意,这段代码将抛出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
是否都有多个父级,具有不同的原始处理日期?不同的交易是否共享相同的ID?
如果您有权访问IMonetaryTransaction
源,那么保留对父事务本身的引用会更加清晰,而不是只存储ID。 E.g。
interface IMonetaryTransaction {
// This...
IMonetaryTransaction getParentBillingTransaction();
// ...rather than this
long getParentBillingTransactionId();
}
但是如果你不能改变这个模型,并且只有一个所有交易的平面列表,父母与子女混在一起,那么通过ID创建交易地图可能更容易(也更有效率): / p>
Map<Long, IMonetaryTransaction> transactions = new HashMap<>();
monetaryTransactions.forEach(txn -> transactions.put(txn.getId(), txn);
因此,当您需要获取给定事务的父级时,您只需要执行此操作,而不是再次遍历整个列表。
IMonetaryTransaction parent = transactions.get(txn. getParentBillingTransactionId());