我在采访中遇到一段时间磕磕绊绊的事情之一就是他们的方法将List接口作为参数和返回类型。考虑这样的事情:
public List<Interval> merge(List<Interval> intervals) {
if(intervals.length()==0) return null; //does not work
}
上面,Eclipse抱怨&#39;方法length()未定义类型List&#39;。同样,我不能使用intervals.length()
在for循环中迭代我已经在网上和其他帖子上搜索过,我知道在Java中,接口是一个框架,我们无法实例化它。但问题是在方法中提供了一个Intervals列表(数据输入),我需要迭代List并进行一些合并工作。我怎么做,因为我似乎甚至无法访问列表。我知道在Java中我们可以初始化一个接口的具体类,如:
List<Integer> ll = new ArrayList<>();
但是在上面的方法中执行此操作会丢失我在参数中获得的所有现有数据。 我在另一篇SO帖子中看到的另一种方法是这样的:
if(intervals instanceOf ArrayList){
//Do some work
}
但显然我无法检查接口可以实现的每个实例,可以吗?我的意思是它看起来并不实用。
有人可以解释如何在方法中迭代数据接受接口/ List吗?
答案 0 :(得分:1)
第一个也是最重要的部分是:你得出了错误的结论。 你不明白Java语法分别是“足够好”的类;然后你“找到”错误的解释你的问题。
让我们开始:
public List<Interval> merge(List<Interval> intervals) {
if(intervals.length()==0) return null; //does not work
}
是,does not work
,两个原因:
length
字段。但是,从基础Collection界面派生的任何接口/类都有size()
方法。把这些东西放在一起;一个(语法上)正确的方法版本如下:
public List<Interval> justReturnListIfNotEmpty(List<Interval> intervals) {
if (intervals == null || intervals.size () == 0) {
return null;
} else {
return intervals;
}
}
更好的是,您可以使用intervals.isEmpty()
代替。请注意:您没有必要,但如果/ then / else构造,即使是一行也总是使用{braces}是一种很好的做法。
下一步:通过
迭代列表for(Integer bigInt : intervals) {
for (int i=0; i < intervals.size() ...
iterator
方法
除此之外,对于“使用接口意味着什么” - 请参阅here。
答案 1 :(得分:-1)
对于第一个问题,List中没有方法长度(),它是size()。
请看this ..这就是你可以做到的。
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
List<Integer> a= new ArrayList();
asd(a);
}
static void asd(List<Integer> a){
Iterator<Integer> it = a.iterator();
while(it.hasNext()){
System.out.print(it.next()); //or do some merge work
}
}
}