如何使用索引迭代列表数据结构。例如,考虑一个列表形式的句子,每个元素都是一个单词。我可以使用索引单步执行每个单词吗?像这样的东西 -
// sentence defined something like this - List<String>
int size = sentence.size();
for (int i=0; i<size-1; i++)
{
System.out.println(sentence[i] + " " + sentence[i+1]);
}
当然上面的代码不起作用,但是可以在这些行上做点什么吗?正如您所看到的,我想访问两个连续的元素并使用迭代器,它开始变得非常混乱。
答案 0 :(得分:6)
您可以使用get(i)
方法代替[i]
:
for (int i=0; i<size-1; i++) {
System.out.println(sentence.get(i) + " " + sentence.get(i+1));
}
答案 1 :(得分:5)
List
个实例与数组不同。他们有特定的方法来获取某些索引的项目。试试这个:
// sentence defined something like this - List<String>
int size = sentence.size();
for (int i=0; i<size-1; i++)
{
System.out.println(sentence.get(i) + " " + sentence.get(i + 1));
}
现在,如果你有一个数组(例如String[] sentence = new String[]{"hello", "there"}
),你所拥有的就可以了。
作为旁注,Java有一个for-each循环,可用于两个数组和List
s:
for (String s : sentence) {
// do something
}
当然,这不能在你的情况下使用,因为你在循环的每次迭代中访问多个索引处的元素 - 但重要的是要知道存在这样的东西。
答案 2 :(得分:2)
Java中的x[i]
表达式语法只能用于数组。没别了。
正如其他答案所述,使用索引逐步浏览Java列表元素的方法是使用List.get(int)
。但是,执行此操作时需要考虑一个重要的性能问题。
问题是get(int)
调用的成本取决于您使用的List
实现类:
对于ArrayList
(或Vector
),长度为N的列表上的get(int)
操作为O(1)
。这意味着它不依赖于列表长度,实际上它很便宜:只比someArray[i]
贵一点。
对于LinkedList
,列表上的get(int)
操作必须从头开始逐步执行,直到达到您要求的位置。如果列表长度为N,则get(int)
的平均成本(假设列表中的随机位置)为O(N)
;即它与列表长度成比例。如果长度很长,那将是昂贵的。
相比之下,如果您使用Iterator
(使用for (E e : l)
语法显式或隐式),则O(1)
中的所有列表实现都将java.util
java.util.concurrent
1}}和{{1}}(忽略多线程问题,例如重度争用)。
话虽如此,有些情况下迭代器不起作用,应用程序需要使用索引。
答案 3 :(得分:0)
在这种情况下,您也可以使用Iterator作为例:
首先将ur元素放在arraylist上并尝试使用Iterator:
ArrayList arrayList = new ArrayList();
Iterator itr = arrayList.iterator();
while(itr.hasNext())
{
System.out.println(itr.next()); // Print out the elements from arraylist
}
答案 4 :(得分:0)
您可以在不使用索引的情况下处理列表中的连续值对。这是一种方式:
private void processWordsInSentence(List<String> sentence) {
Iterator<String> it = sentence.iterator();
if (it.hasNext()) {
String previous = it.next();
while(it.hasNext()) {
String current = it.next();
// use previous and current values, e.g.
System.out.println(previous + " " + current);
previous = current;
}
}
}
为什么要使用这样的内容而不是sentence.get(index)
?我会提出几个原因:
在您的示例中,您的处理实际上是关注连续的 列表中的值,而不是它们的位置。所以没有“增值” 必须明确地摆弄指数。
请记住List<T>
是一个多重接口
实现。 ArrayList<T>
常量执行.get(index)
时间,但LinkedList<T>
上同一个电话需要时间
与index
的值成比例。所以可能会有真正的表现
考虑。
上面的processWordsInSentence
实现必须明确处理少于两个元素的列表的情况。保护if
内的循环可以使用for
语句编写,如果您更喜欢该样式,则可以将遍历与处理实际数据分开。(/ p>
private void processWordsInSentence(List<String> sentence) {
Iterator<String> it = sentence.iterator();
if (it.hasNext()) {
for (
String previous = it.next(), current = null;
it.hasNext();
previous = current
) {
// use previous and current values, e.g.
System.out.println(previous + " " + current);
}
}
}
答案 5 :(得分:0)
试试这个简单的代码:
List mobileSoftwares = new ArrayList();
mobileSoftwares.add("Android");
mobileSoftwares.add("IOS");
mobileSoftwares.add("Blackberry");
int size = mobileSoftwares.size();
for (int i = 0; i < size - 1; i++)
{
System.out.println(mobileSoftwares.get(i));
}