C#中list的getRange方法在java的改写

2020-07-13  本文已影响0人  cmeizu

c#中的list集合操作方法getRange(index,count)

public List<T> GetRange(int index, int count)
    {
      if (index < 0)
        ThrowHelper.ThrowIndexArgumentOutOfRange_NeedNonNegNumException();
      if (count < 0)
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.count, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
      if (this._size - index < count)
        ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidOffLen);
      List<T> objList = new List<T>(count);
      Array.Copy((Array) this._items, index, (Array) objList._items, 0, count);
      objList._size = count;
      return objList;
    }

上面的是getRange的原码.
其原理就是通过构造一个数组来实现取值,最后转为集合返回.

using System;
using System.Collections.Generic;

namespace helloword
{
    class Program
    {
        static void Main(string[] args)
        {

            var list1 = new List<int>() { 1, 2, 3, 4, 5 };
            var index = 2;
            var count = 3;
            var result = list1.GetRange(index, count);

            foreach (var t in result)
            {
                Console.WriteLine(t);
            }

        }
    }
}

结果是

3
4
5

现在我debug进去看一下执行的过程


image.png

我们传入的长度其实是5,但是这里是8,2^3.容量的算法感兴趣的可以再去看看.

public static void Copy(
      Array sourceArray,
      int sourceIndex,
      Array destinationArray,
      int destinationIndex,
      int length)
    {
      Array.Copy(sourceArray, sourceIndex, destinationArray, destinationIndex, length, false);
    }

这里是取值算法.看源码后会发现挺简单的.

接下来说一下java怎么去实现这个功能.
看懂原理后其实就很简单了.从index开妈向取count个元素.我们也不用中间数组来操作.直接拿一个新集合来接收就可以了.
具体实现如下:

package cn.cmeizu.helloword.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 陈英俊
 * @date 2020/6/10 13:57
 */
public class LinkedListDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        int index = 2;
        int count = 3;
        for (int i = 0; i < count; i++) {
            System.out.println(list.get(index + i));
        }
    }
}

结果:

3
4
5
上一篇下一篇

猜你喜欢

热点阅读