题目
修复Filtering方法中的错误
该方法应该从列表中删除偶数并返回包含奇数的列表。
但是,该方法中存在需要解决的错误。
import java.util.List;
public class Kata13December {
public static List<Integer> filterOddNumber(List<Integer> listOfNumbers)
{
for (int i = 0; i < listOfNumbers.size(); i++)
{
if (listOfNumbers.get(i)%2 == 0)
{
listOfNumbers.remove(i);
}
}
return listOfNumbers;
}
}
测试用例:
import org.junit.Test;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import static org.junit.Assert.assertEquals;
public class Kata13DecemberTest {
@Test
public void firstTest() throws Exception {
List<Integer> listOfNumbers = new LinkedList<>(Arrays.asList(1, 2, 2, 2, 4, 3, 4, 5, 6, 7));
List<Integer> expectedResult = new LinkedList<>(Arrays.asList(1, 3, 5, 7));
assertEquals(expectedResult,Kata13December.filterOddNumber(listOfNumbers));
}
@Test
public void secondTest()
{
List<Integer> listOfNumbers = new LinkedList<>(Arrays.asList( 1, 2, 2, 2, 4, 3, 4 ));
List<Integer> expectedResult = new LinkedList<>(Arrays.asList( 1, 3 ));
assertEquals(Arrays.toString(expectedResult.toArray()), Arrays.toString(Kata13December.filterOddNumber(listOfNumbers).toArray()));
}
}
解题
import java.util.List;
public class Kata13December {
public static List<Integer> filterOddNumber(List<Integer> listOfNumbers)
{
for (int i = 0; i < listOfNumbers.size(); i++)
{
if (listOfNumbers.get(i)%2 == 0)
{
listOfNumbers.remove(i); // 在这里移除了某元素,会是列表的总长度变化,原来第i+1位变成了第i位,所以下面i自减,再检验一遍第i个元素
i--;
}
}
return listOfNumbers;
}
}
Other:
import java.util.*;
import java.lang.*;
import java.util.Collections.*;
import java.util.stream.Collectors;
public class Kata13December {
public static List<Integer> filterOddNumber(List<Integer> listOfNumbers)
{
return listOfNumbers.stream().filter(l -> l%2 != 0).collect(Collectors.toList());
}
}
import java.util.List;
import java.util.ArrayList;
public class Kata13December {
public static List<Integer> filterOddNumber(List<Integer> listOfNumbers)
{
List<Integer> listOfOddNumbers = new ArrayList<Integer>();
for (Integer n : listOfNumbers)
{
if (n % 2 != 0)
{
listOfOddNumbers.add(n);
}
}
return listOfOddNumbers;
}
}
这个方法也挺好的:
import java.util.List;
public class Kata13December {
public static List<Integer> filterOddNumber(List<Integer> listOfNumbers)
{
for (int i = listOfNumbers.size()-1; i >= 0; i--)
{
if (listOfNumbers.get(i)%2 == 0)
{
listOfNumbers.remove(i);
}
}
return listOfNumbers;
}
}
后记
循环时变动列表时特别要注意下标。
网友评论