簡體   English   中英

連續迭代集合和數組的最佳方法

[英]best way to Iterate over a collection and array consecutively

這是一個非常微不足道的問題,與編碼風格有關,我只是要求使我的編碼風格更具可讀性

假設我有一個像 linksList 和一個數組這樣的集合,我需要同時迭代兩者。
目前我知道的最好的方法是在列表上獲取迭代器並在迭代器循環之外定義一個索引變量,並同時增加索引變量以訪問下一個元素 {list 和 array}。
請參考下面的例子

LinkedList<Integer> list = new LinkedList<Integer>();
Integer[] arr = new Array[25];
// lets suppose both have 25 elements.

// My Iteration method will be 
int index =0;

for (Integer val : list) {
  System.out.println(val);
  System.out.println(arr[index++]);
}


那么它是唯一的方法還是有任何其他方法可以以更具可讀性和更相關的方式執行此迭代,我不必單獨使用索引變量。
我知道數組可能有比集合更少或更多的元素,但我只是在談論它們相等並且我們需要迭代它們的情況。

PS:任何人都可以編寫計算機可以理解的代碼,實際挑戰是編寫人類可以輕松理解的代碼。

你所擁有的本質上很好:它很簡單,簡單就足以使代碼可讀。

我唯一要注意的是arr[index++]index++的副作用:比如說,如果你想在循環體中多次使用相同的值,你不能簡單地復制+粘貼。

考慮提取一個變量作為循環中的第一件事來存儲“當前”數組元素(這本質上是增強的 for 循環對列表元素所做的)。

for (Integer val : list) {
  Integer fromArr = arr[index++];

  // ...
}

只是為了指出沒有單獨的索引變量的替代方法,您可以使用ListIterator ,它為您提供元素的索引。

// Assuming list and are have same number of elements.
for (ListIterator<Integer> it = list.listIterator();
    it.hasNext();) {
  // The ordering of these statements is important, because next() changes nextIndex().
  Integer fromArr = arr[it.nextIndex()];
  Integer val = it.next();

  // ...
}

ListIterator並不是一個特別廣泛使用的類。 它的使用本身可能會令人困惑。


ListIterator方法的缺點之一是您必須正確使用it :您不應該在循環內觸摸它(在獲取值之后),您必須以正確的順序放置語句等。

另一種方法是創建一個類似於 Python 的enumerate的庫方法:

static <T> Iterable<Map.Entry<Integer, T>> enumerate(Iterable<? extends T> iterable) {
  return () -> new Iterator<T>() {
    int index = 0;
    Iterator<? extends T> delegate = iterable.iterator();

    @Override public boolean hasNext() { return delegate.hasNext(); }

    @Override public Map.Entry<Integer, T> next() {
      return new AbstractMap.SimpleEntry<>(index++, delegate.next());
    }
  };
}

這將返回一個可迭代的映射條目,其中鍵是索引,值是相應的值。

然后,您可以在增強的 for 循環中使用它:

for (Map.Entry<Integer, Integer> entry : enumerate(list)) {
  Integer fromList = entry.getValue();
  Integer fromArr = arr[entry.getKey()];
}

一種選擇是有 2 個迭代器,但我認為它沒有更清楚:

for (Iterator<Integer> i1 = list.iterator(), i2 = Arrays.asList(arr).iterator();
    i1.hasNext() && i2.hasNext();) {
    System.out.println(i1.next());
    System.out.println(i2.next());
}

但它更健壯,因為它以 2 個集合中較短的一個結束。

我試圖簡化和處理大小明智的集合,其中兩者不必具有相同的大小。 我相信即使尺寸不同,這也會起作用,只需一個循環就足夠了。 下面的代碼片段:

LinkedList<Integer> list = new LinkedList<Integer>();
Integer[] arr = new Array[25];
int maxLength= Math.max(list.size(),arr.size());
//Looping over the lengthy collection( could be Linkedlist or arraylist)
for(int i=0;i<maxLength;i++){
if(list.size()>i)
  System.out.println(list[i]);
if(arr.size()>i)
  System.out.println(arr[i]);
}

希望這可以幫助! 謝謝

暫無
暫無

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

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