美文网首页
每日一练111——Java过滤偶数(错误修复)(8kyu)

每日一练111——Java过滤偶数(错误修复)(8kyu)

作者: 砾桫_Yvan | 来源:发表于2018-11-23 23:54 被阅读0次

题目

修复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;
    }
}

后记

循环时变动列表时特别要注意下标。

相关文章

网友评论

      本文标题:每日一练111——Java过滤偶数(错误修复)(8kyu)

      本文链接:https://www.haomeiwen.com/subject/vpxeqqtx.html