【问题标题】:How to iterate over ArrayLists of different objects with a single method?如何使用单个方法迭代不同对象的 ArrayLists?
【发布时间】:2019-09-16 22:49:35
【问题描述】:

我正在尝试遍历两个不同类型的 ArrayList 字段。虽然我可以为每种类型编写方法,但有没有办法只用一个方法来迭代它们?我似乎不太清楚是否可以将字段作为方法参数传递。在下面的代码中,iteratePhrase() 方法应该打印任一 ArrayList 中的所有元素。其中,[...] 表示numbersletters

import java.util.ArrayList;
import java.util.List;

public class Phrase {
    private List<Number> numbers;
    private List<Letter> letters;

    public Phrase() {
        numbers;
        letters;
    }

    public void iteratePhrase() {
        for (int i=0; i<[...].size(); i++)
            System.out.println([...].get(i));
    }
}

【问题讨论】:

    标签: java oop arraylist methods


    【解决方案1】:

    您可以将iteratePhrase 设为通用,即使用List&lt;T&gt;;喜欢

    public <T> void iteratePhrase(List<T> al) {
        for (int i = 0; i < al.size(); i++) {
            System.out.println(al.get(i));
        }
    }
    

    您也可以使用 for-each 循环,例如,

    for (T t : al) {
        System.out.println(t);
    }
    

    在任何一种情况下,您都会调用

    iteratePhrase(numbers);
    

    iteratePhrase(letters);
    

    【讨论】:

    • 谢谢!似乎我无法在al.get(i) 的结果上调用方法(大概是因为它的类型未知?)。你知道我会怎么做(al.get(i)).call(),其中 call() 是numbersletters 都有的方法吗?
    • 程序为通用接口,将&lt;T&gt;中的T改为T extends Foo
    【解决方案2】:

    您可以让numbersletters 扩展一个公共类,例如IterableObject

    然后,像这样迭代

    public void iteratePhrase(List<IterableObject> l) {
        for (int i = 0; i < l.size(); i++) {
            System.out.println(l.get(i));
        }
    }
    

    或者这个

    public void iteratePhrase(List<IterableObject> objects) {
        for (IterableObject object : objects) {
            System.out.println(object);
        }
    }
    

    但是,iteratePhrase 函数将只接受扩展 IterableObject 的对象,这与上面的泛型答案不同。

    【讨论】:

      【解决方案3】:

      您可以使用 java 8 流:

      public <T> void iteratePhrase(List<T> al) {
         al.stream.forEach(System.out::println);
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 2017-09-30
        • 2021-12-12
        • 2016-02-16
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多