2014-10-09 68 views
1

我想複製一個PriorityQueue對象。PriorityQueue的副本,而不會干擾原始的PriorityQueue

我的目標是改變我複製的一些目標沒有改變我原來的PriorityQueue

爲了做到這一點我做了我的PriorityQueue的副本,我刪除我的副本的值,但是當我檢查我的PriorityQueue仍然是一樣的,不幸的是原來的PriorityQueue也發生了變化......如果您有任何建議,我們將歡迎您。

請找什麼,我試過一個例子:

public class PQExample 
{ 
    public int id; 
    public int price; 
    public String name; 
    public long date; 

     public PQExample(int id, int price, String name, long time) 
     { 
      this.id = id; 
      this.price = price; 
      this.name = name; 
      this.date = time; 
     } 

     public static void main(String[] args) 
     { 
      PriorityQueueComparator pqc = new PriorityQueueComparator(); 
      PriorityQueue<PQExample> PQ = new PriorityQueue<PQExample>(pqc); 
      int setID = 1000; 
      int setDate = 0; 
      PQ.add(new PQExample(setID++, 24 , "Mat", setDate++)); 
      PQ.add(new PQExample(setID++, 25 , "Tommy", setDate++)); 
      PQ.add(new PQExample(setID++, 22 , "Kate", setDate++)); 
      PQ.add(new PQExample(setID++, 26 , "Mary", setDate++)); 
      PQ.add(new PQExample(setID++, 24 , "Ronny", setDate++)); 
      PQExample valueToDel = new PQExample(1000,22,"Mat",0); 

      PriorityQueue<PQExample> PQCopy = new PriorityQueue<PQExample>(); 
      PQCopy = PQ; 

      //Now I want to delete only in PQCopy and not in PQ  
      PQCopy.remove(valueToDel); 

      //Unfortunately Mat was deleted of both objects : PQ and PQCopy... 
      for (int i = 0; i < 4; i++) { 
       System.out.println("Queue in: " + i + " is " + PQ.peek().name + " with the price of " + PQ.peek().price); 
       PQ.poll(); 
      } 
     } 
@Override 
public boolean equals(Object o) 
{ 
    if (o instanceof PQExample) 
    { 
     PQExample pqExample = (PQExample)o; 
     return id == pqExample.id; 
    } 
    return false; 
} 


class PriorityQueueComparator implements Comparator<PQExample> 
{ 
    @Override 
    public int compare(PQExample o1, PQExample o2) { 
     if (o1.price < o2.price){return 1;}else if (o1.price > o2.price){return -1;} 
     else 
     {if (o1.date<o2.date){return -1;}else{return 1;}} 
    } 
} 

回答

1

你在做什麼在這裏:

PriorityQueue<PQExample> PQCopy = new PriorityQueue<PQExample>(); 
PQCopy = PQ; 

是:

  1. 創建一個新的對象,並存儲在它的參考PQCopy
  2. PQCopy引用相同的對象比PQ

你需要創建一個新的PriorityQueue對象與拷貝構造器來代替:

PriorityQueue<PQExample> PQCopy = new PriorityQueue<>(PQ); 

正如你精讀閱讀here

創建一個PriorityQueue,其中包含指定的 集合中的元素...

請注意,儘管它將集合複製到一個新集合中,但引用的對象是相同的。這意味着如果你改變了包含的對象屬性,這些改變將會在兩個集合的元素中被注意到。

編輯

PriorityQueue<Integer> PQ= new PriorityQueue<Integer>(); 
    PQ.add(3); 
    PQ.add(4); 
    PriorityQueue<Integer> PQCopy = new PriorityQueue<>(PQ); 
    PQCopy.remove(); 

    for(Integer i: PQ) 
    { 
     System.out.println(i); 
    } 

    for(Integer i: PQCopy) 
    { 
     System.out.println(i); 
    } 

這等例子說明如何,如果包含的對象是可變的,改變它們會影響到複製列表太:

class CTest implements Comparable<CTest> { 
     public CTest(int v) { 
      this.v = v; 
     } 
     Integer v; 

     @Override 
     public int compareTo(CTest o) { 
      return this.v.compareTo(o.v); 
     } 
    } 

    PriorityQueue<CTest> PQ= new PriorityQueue<CTest>(); 
    PQ.add(new CTest(3)); 
    PQ.add(new CTest(4)); 
    PriorityQueue<CTest> PQCopy = new PriorityQueue<>(PQ); 
    PQCopy.iterator().next().v = new Integer(6); 

    for(CTest i: PQ) 
    { 
     System.out.println(i.v); 
    } 

    for(CTest i: PQCopy) 
    { 
     System.out.println(i.v); 
    } 
+0

感謝您的快速回答,這是我第一個改變構造函數的反射,但事實上它仍然是在兩個對象中刪除。 – Imagine 2014-10-09 15:00:31

+0

@Imagine你必須做一些其他的事情,用拷貝構造函數創建的集合是一個新對象,並且'PQ'上的結構變化不會影響'PQCopy',反之亦然。查看我的答案編輯的例子。 – 2014-10-09 15:06:24

+2

@Imagine請注意,隊列包含引用,而不是對象,因此任何對元素屬性的更改都將在這兩個集合中註明。 – 2014-10-09 15:12:52

2

PQcopy僅僅是第二次提到實際的PriorityQueue對象。您想clone原來的PQ,而不是隻分配參考。 PriorityQueue has a constructor它可以實現這個要求:順便

PriorityQueue<PQExample> PQCopy = new PriorityQueue<PQExample>(PQ) 

,你應該遵循的大小寫約定的Java - 從大寫字母是不可取的變量名。

+0

感謝您的快速回答,我在代碼中做了更改,但它仍然在兩個對象中刪除... – Imagine 2014-10-09 15:01:03

+0

您是否刪除了行'PQCopy = PQ;'?構造函數完成所有的複製操作,如果你之後保留了明確的賦值,那麼你將撤銷構造函數的好工作,並且馬上回到你開始的地方。 – pjs 2014-10-09 15:20:34

+0

你是對的;那是我讓的錯誤的構造函數 – Imagine 2014-10-09 15:49:12