美文网首页
C#中list的getRange方法在java的改写

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

作者: cmeizu | 来源:发表于2020-07-13 17:42 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:C#中list的getRange方法在java的改写

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