簡體   English   中英

我正在嘗試創建一個循環的LinkedList,請告訴我它是否是正確的方法

[英]I am trying to create a circular LinkedList Please tell me if its a correct way to do it

我已經實現了邏輯,例如如果我給出的索引還不存在,它將改變索引的提示(就像旋轉,我猜)。

import java.util.LinkedList;

public class MycircularlinkedList extends LinkedList {

    private static int count = 0;

    public Object get(int i) {
        System.out.println("count==" + count);
        if (i > count) {
            i = i % count;
            return super.get(i);

        } else {
            return super.get(i);
        }

    }

    public boolean add(Object o) {

        super.add(o);
        count++;
        return true;
    }

    public void add(int i, Object o) {
        if (i > count)
            i = i % count;
        super.add(i, o);
        count++;
    }
}

我可以看到幾點:

  1. count是靜態的,這意味着您在這里只會有一個數字。 可能不是您想要的
  2. count是多余的,請使用Collection#size()
  3. mod( % )的偉大之處在於它適用於所有數字,您不需要有條件的。 2 % 12 == 14 % 12 == -10 % 12
  4. 如果要擺脫count屬性,則可以擺脫被覆蓋的#add(Object o)邏輯,而只是return super.add(o);

我發現您的代碼存在一些問題:如果count == 0並且如果我使用方法add(7,obj),則7%0將引發ArithmeticException.count應該聲明為private,因為您可能有兩個類實例。另外,您還需要檢查poll \\ offerLast方法是否滿足您的需求,因為您不能限制任何客戶端代碼來避免使用它們。最后,需要重寫clone \\ readObject \\ writeObject才能包含count變量。

你近了

(1)術語“ 循環鏈表 ”是眾所周知的,是指尾巴鏈接回頭的列表(反之亦然,如果它是雙鏈表)。 您的檔案更像是儲存在鏈表中的“圓形緩沖區”。 我們可以稱其為LinkedListCircularBuffer東西。

(2)該類應通過元素類型進行參數化,因此

public class LinkedListCircularBuffer<E> extends LinkedList<E> {
  @Override
  public E get(int i) {
    return super.get(i % size()); // simpler and faster without an "if"
  }
}

(3)您可以調用size()而不是所有代碼來維護另一個count

(4)您的add(int i, Object o)方法不支持i == size() ,但是您可以通過完全不覆蓋add()來解決此問題。

(5)重寫的方法需要@Override注釋。

(6) 始終在每個“ then”和“ else”子句周圍使用花括號是一種很好的樣式。 像這樣的代碼

if (i > count)
  i = i % count;

是脆弱的,例如,在“ then”子句中添加println()語句將破壞它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM