2016-01-14 1 views
0

Я довольно новичок в Java, поэтому надеюсь, что правильно объясню этот сценарий.Как скопировать объект списка в качестве указателя на исходный объект

Я пытаюсь скопировать объект List, но хочу, чтобы мой второй экземпляр указывал на тот же объект, что и первый объект List. Единственная причина, по которой мне нужны две копии, - это то, что мне нужно перебирать каждую из них самостоятельно. Я пытался найти способ и даже попросил нескольких коллег, но единственное, что работает, - это создать еще один объект.

Любая помощь будет очень оценена.

Спасибо, Christine

Update: Вот пример того, что я пытаюсь сделать:

Это как я в настоящее время списки заявил:

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

Похоже, что вы, возможно, захотите объяснить свою фактическую проблему. – Marvin

+0

Я пытаюсь понять, почему вы хотите переименовать оба списка с одинаковыми данными? Если есть прямая ссылка на эти объекты, тогда возникнет проблема, называемая ConcurrentModificationException, которая может возникнуть при попытке изменить. –

+0

Я не буду изменять ни один из них.Мне в основном нужно перебирать список, сначала оценивая каждую транзакцию, а затем в определенных точках мне может потребоваться повторить этот же список, но на этот раз ищет родительскую транзакцию транзакции, с которой я работаю в первом цикле, и мне нужно возможность сортировать и управлять каждым итератором самостоятельно. – Christine

ответ

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 более одного родителя с разными исходными датами процесса? У разных транзакций общий идентификатор?

Если у вас есть доступ к источнику IMonetaryTransaction, было бы проще хранить ссылку на родительскую транзакцию, а не хранить только идентификатор. Например.

interface IMonetaryTransaction { 
    // This... 
    IMonetaryTransaction getParentBillingTransaction(); 

    // ...rather than this 
    long getParentBillingTransactionId(); 
} 

Но если вы не можете изменить эту модель, и только плоский список всех сделок, родители вперемешку с детьми, это может быть проще (и эффективнее), чтобы создать карту сделок по идентификатору :

Map<Long, IMonetaryTransaction> transactions = new HashMap<>(); 
monetaryTransactions.forEach(txn -> transactions.put(txn.getId(), txn); 

Так что, когда вам нужно получить родитель данной транзакции, вы просто должны сделать это вместо того, чтобы снова перебирая весь список.

IMonetaryTransaction parent = transactions.get(txn. getParentBillingTransactionId()); 
+0

В моем первом цикле я просматриваю список, просматривая информацию о каждой транзакции в списке. Во втором случае я хочу снова повторить попытку, на этот раз глядя на родительскую транзакцию транзакции. Я в основном хочу два экземпляра, поэтому я не влияю на итератор в моем петле. – Christine

+0

ОК, но это не похоже на вложенный цикл, поэтому не уверен, что у вас будет «внешний цикл» вообще. Если вы можете опубликовать какой-то реальный код для своего сценария, это может быть проще обсуждать. – Riaz

+0

привет, я отредактировал свое оригинальное сообщение, чтобы включить пример того, что я пытаюсь сделать. – Christine

1

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

List<String> list = new ArrayList<>(); 
List<String> anotherPointer = list; 

Теперь все, что вы со ссылками list и anotherPointer будет отражать на самом объекте.

list.add("Hello"); 
System.out.println(anotherPointer.size()); //Prints 1 
+0

Это был бы отличный ответ, если бы он правильно использовал дженерики. –

+0

@LouisWasserman Fair Point. Обновлен мой ответ. – Kon

+0

Это имеет смысл, спасибо. Будет ли эта структура влиять на мою способность сортировать каждую ссылку на список и управлять отдельными итераторами? – Christine

0

Если вы не хотите, чтобы создать еще один List объект, который вы можете использовать две переменные int вместе с функцией get(int index), чтобы получить доступ к List по различным показателям.

 Смежные вопросы

  • Нет связанных вопросов^_^