编程语言对比系列:二、数组的基本使用

2018-03-01  本文已影响85人  oceanfive

文章大纲如下:

[TOC]

markdown[TOC] 语法在简书上好像没有效果。。。。。

一、初始化 init array File URL Array

OC init array File URL

    // 空数组
    + (instancetype)array;
    - (instancetype)init NS_DESIGNATED_INITIALIZER;
    
    // 通过一个元素构建数组
    + (instancetype)arrayWithObject:(ObjectType)anObject;
    
    // 通过多个元素构建数组
    + (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
    - (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
    
    // 通过其他数组
    + (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;
    - (instancetype)initWithArray:(NSArray<ObjectType> *)array;
    // flag 为 YES 时进行“深拷贝”
    - (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;
    
    // 通过文件路径 file 或 url
    // 这两个方法带有 error 参数,11.0之后可以使用
    - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error  API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) NS_SWIFT_UNAVAILABLE("Use initializer instead");
    // 下面的方法不带有 error 参数,后面会被废弃掉
    + (nullable NSMutableArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
    + (nullable NSMutableArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
    - (nullable NSMutableArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
    - (nullable NSMutableArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
    
    // 通过 c 语言数组
    - (instancetype)initWithObjects:(const ObjectType _Nonnull [_Nullable])objects count:(NSUInteger)cnt NS_DESIGNATED_INITIALIZER;
    + (instancetype)arrayWithObjects:(const ObjectType _Nonnull [_Nonnull])objects count:(NSUInteger)cnt;
    
    // 通用
    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

    // 可变数组 ----
    - (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;
    + (instancetype)arrayWithCapacity:(NSUInteger)numItems;
    // 单个元素
    NSArray *array = [NSArray arrayWithObject:@1];
    NSLog(@"%@", array);
    // 输出:
    (
        1
    )
    
    // 多个元素
    NSArray *array = [NSArray arrayWithObjects:@1, @2, @3, @4, nil];
    NSLog(@"%@", array);
    // 输出:
    (
        1,
        2,
        3,
        4
    )
    
    // 通过其他数组
    NSArray *arr = @[@1, @2, @3, @4];
    NSArray *array = [NSArray arrayWithArray:arr];
    NSLog(@"%@", array);
    // 输出:
    (
        1,
        2,
        3,
        4
    )
    
    // 通过 文件 / url 
     NSArray *arrayFile = @[@1, @2, @3, @4];
    [arrayFile hy_writeToFileWithPath:HYAPPSandboxPathDocuments fileName:@"arrayFile.plist"];
    
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *file = [filePath stringByAppendingPathComponent:@"arrayFile.plist"];
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:file];
    NSLog(@"%@", array);
    
    NSError *error = nil;
    NSArray *array2 = [[NSArray alloc] initWithContentsOfURL:[NSURL fileURLWithPath:file] error:&error];
    if (!error) {
        NSLog(@"成功");
        NSLog(@"%@", array2);
    } else {
        NSLog(@"失败");
        NSLog(@"%@", error);
    }
    // 输出
    (
        1,
        2,
        3,
        4
    )
    成功
    (
        1,
        2,
        3,
        4
    )
    
    // 通过 c 语言数组
    NSString *strings[3];
    strings[0] = @"First";
    strings[1] = @"Second";
    strings[2] = @"Third";
    
    NSArray *stringsArray = [NSArray arrayWithObjects:strings count:2];
    NSLog(@"%@", stringsArray);
    // 输出:
    (
        First,
        Second
    )

Java Array

    // 构造一个初始容量为 10 的空列表
    public ArrayList()
    // 构造一个具有指定初始容量(initialCapacity)的空列表
    public ArrayList(int initialCapacity)
    // 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
    public ArrayList(Collection<? extends E> c)
    // 初始化
    ArrayList arrayList = new ArrayList();
    
    // 通过其他集合初始化
    ArrayList otherList = new ArrayList();
    otherList.add(1);
    otherList.add(2);

    ArrayList arrayList = new ArrayList(otherList);
    Log.e("数组", arrayList.toString());
    Log.e("数组", String.valueOf(arrayList.size()));
    // 输出:
    E/数组: [1, 2]
    E/数组: 2

JS Array.from Array.of

    Array.from()
    Array.of(element0[, element1[, ...[, elementN]]])
    var array = Array.from('hello')
    console.log(array)
    // 输出:
    ["h", "e", "l", "l", "o"]
    
    // 我是分割线 ------
    var array = Array.of(1, 2, "9")
    console.log(array)
    // 输出:
    [1, 2, "9"]

小结

二、长度 count size length

OC count

    @property (readonly) NSUInteger count;
    NSArray *array;
    NSLog(@"%@ : %ld", array, array.count);
    array = [NSArray array];
    NSLog(@"%@ : %ld", array, array.count);
    array = @[@"hello"];
    NSLog(@"%@ : %ld", array, array.count);
    
    // 输出:
    (null) : 0
    (
    ) : 0
    (
        hello
    ) : 1

Java size

    public int size()
    ArrayList arrayList = new ArrayList();
    Log.e("数组", String.valueOf(arrayList.size()));
    arrayList.add(1);
    arrayList.add(2);
    Log.e("数组", String.valueOf(arrayList.size()));
    // 输出:
    E/数组: 0
    E/数组: 2

JS length

    length
    var array = [1, 2, 3, 4, 5, 6];
    console.log(array.length)
    // 输出:
    6

小结

三、获取 AtIndex get array[]

OC AtIndexfirstObject , lastObject

    // 快捷方式
    array[]
    
    // 获取 index 位置处的元素,index 超过数组范围会crash
    - (ObjectType)objectAtIndex:(NSUInteger)index;
    
    // 获取第一个元素
    @property (nullable, nonatomic, readonly) ObjectType firstObject API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    // 获取最后一个元素
    @property (nullable, nonatomic, readonly) ObjectType lastObject;
    
    // 获取多个元素
    - (NSArray<ObjectType> *)objectsAtIndexes:(NSIndexSet *)indexes;
    NSArray *array = @[@1, @2, @3, @4];
    NSLog(@"%@", [array objectAtIndex:0]);
    NSLog(@"%@", array[0]);
    NSLog(@"%@", [array firstObject]);
    NSLog(@"%@", [array lastObject]);
    
    // 输出: (当传入参数为 -1 ,10 时 会crash)
    1
    1
    1
    4

Java get

    /**
     * 获取 index 位置处的元素, index 超过 数组范围 [0, size - 1] 会crash,即 index < 0 || index >= size()
     */
    public E get(int index)
    ArrayList arrayList = new ArrayList();
    arrayList.add(1);
    arrayList.add(2);
    Log.e("数组", String.valueOf(arrayList.get(0)));
    // 输出:
    E/数组: 1
    
    // 分割线 -------
    
    int[] numbers = new int[3];
    numbers[0] = 1;
    numbers[1] = 2;
    Log.e("数组", String.valueOf(numbers[1]));

JS filter find findIndex

    // 快捷方式
    array[]
    
    /**
     * 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
     * callback : 用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。返回true表示保留该元素(通过测试),false则不保留。
     * thisArg : 可选。执行 callback 时的用于 this 的值。
     * 返回值 : 一个新的通过测试的元素的集合的数组
     */
    var new_array = arr.filter(callback[, thisArg])
    
    /**
     * 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。
     * callback :在数组每一项上执行的函数。调用时使用参数 (element, index, array)。
     * thisArg :可选,指定 callback 的 this 参数。
     * 返回值 : 当某个元素通过 callback 的测试时,返回数组中的一个值,否则返回 undefined。
     */
     arr.find(callback[, thisArg])
     
    /**
     * 方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1
     * callback :在数组每一项上执行的函数。调用时使用参数 (element, index, array)。
     * thisArg :可选,指定 callback 的 this 参数。
     * 返回值 : 当某个元素通过 callback 的测试时,返回数组中的一个值的索引 index ,否则返回 -1。
     */
     arr.findIndex(callback[, thisArg])
    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array[1]) // 5
    console.log(array[-1]) // undefined
    console.log(array[100]) // undefined
    
    // 我是分割线 -------
    
    var array = [1, 5, 15, 20, 30, 100, 200]
    var result = array.filter(isBigEnough)
    console.log(result)
    
    function isBigEnough(element, index, array) {
        return element >= 10;
    }
    // 输出:
    [15, 20, 30, 100, 200]
    
    // 我是分割线 -------
    
    var array = [1, 5, 15, 20, 30, 100, 200]
    var result = array.find(isBigEnough)
    console.log(result)
    // 输出:
    15
    
    // 我是分割线 -------
    
    var array = [1, 5, 15, 20, 30, 100, 200]
    var result = array.findIndex(isBigEnough)
    console.log(result)
    // 输出:
    2

小结

四、增加 add insert addAll concat push unshift

OC addinsert

    // 在 “末尾” 添加元素 ,“原来数组”不发生变化,返回一个新的数组
    - (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
    
    // 在 “末尾” 添加其他数组
    - (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    
    // 可变数组 ---------
    // 在 末尾 添加元素
    - (void)addObject:(ObjectType)anObject;
    
    // 在 index 位置处 添加元素
    - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
    
    // 在 “末尾” 添加其他数组
    - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    
    // 把 objects 中的 集合索引 indexes 中的元素 依次取出,然后插入到 "源数组" 相应的 集合索引 indexes 中的位置处
    - (void)insertObjects:(NSArray<ObjectType> *)objects atIndexes:(NSIndexSet *)indexes;
    // 添加元素
    NSArray *array = @[@1, @2];
    NSArray *result = [array arrayByAddingObject:@4];
    NSLog(@"%@", result);
    // 输出:
    (
        1,
        2,
        4
    )
    
    // 添加其他数组
    NSArray *otherArray = @[@10, @11];
    NSArray *array = @[@1, @2];
    NSArray *result = [array arrayByAddingObjectsFromArray:otherArray];
    NSLog(@"%@", result);
    // 输出:
    (
        1,
        2,
        10,
        11
    )
    
    // 可变数组
    // 添加单个元素
    NSMutableArray *array = [NSMutableArray array];
    [array addObject:@1];
    NSLog(@"%@", array);
    // index 超过范围(-1 或 10)会 crash
    [array insertObject:@2 atIndex:0];
    NSLog(@"%@", array);
    
    // 输出:
    (
        1
    )
    (
        2,
        1
    )
    
    // 添加数组
    NSArray *otherArray = @[@10, @11];
    NSMutableArray *array = [NSMutableArray array];
    [array addObjectsFromArray:otherArray];
    NSLog(@"%@", array);
    // 输出:
    (
        10,
        11
    )
    
    // 插入到特定位置
    NSArray *otherArray = @[@10, @11];
    NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
    [set addIndex:0];
    [set addIndex:3];
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, nil];
    [array insertObjects:otherArray atIndexes:set];
    NSLog(@"%@", array);
    // 输出:
    (
        10,
        1,
        2,
        11,
        3,
        4,
        5
    )

Java add addAll

    // 将元素e添加到此列表的尾部。
    public boolean add(E e)
    
    // 将元素element插入此列表中的指定位置index处。索引超过范围会crash
    public void add(int index, E element)
    
    // 将该 collection 中的所有元素添加到此列表的尾部, 如果指定的 collection 为 null 会 crash
    public boolean addAll(Collection<? extends E> c)
    
    // 将该 collection 中的所有元素添加到此列表中的指定位置index处, 如果指定的 collection 为 null 会 crash, 索引超过范围会crash
    public boolean addAll(int index, Collection<? extends E> c)
    ArrayList otherArray = new ArrayList();
    otherArray.add(1);
    otherArray.add(2);

    ArrayList arrayList = new ArrayList();
    arrayList.add(100);
    Log.e("数组", String.valueOf(arrayList));
    arrayList.add(0, 150);
    Log.e("数组", String.valueOf(arrayList));
    arrayList.addAll(otherArray);
    Log.e("数组", String.valueOf(arrayList));
    arrayList.addAll(1, otherArray);
    Log.e("数组", String.valueOf(arrayList));
    arrayList.add(null);
    Log.e("数组", String.valueOf(arrayList));
    // 输出:
    E/数组: [100]
    E/数组: [150, 100]
    E/数组: [150, 100, 1, 2]
    E/数组: [150, 1, 2, 100, 1, 2]
    E/数组: [150, 1, 2, 100, 1, 2, null]

JS concat push unshift

    // 添加 “元素” 或 “数组”,返回新数组,源数组和添加数组的值不改变
    var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
    
    // 方法将一个或多个元素添加到数组的末尾,并返回新数组的长度。改变原数组的值
    arr.push(element1, ..., elementN)
    
    // 方法将一个或多个元素添加到数组的开头,并返回新数组的长度。改变原数组的值
    arr.unshift(element1, ..., elementN)
    
    // 在某个 索引位置 处添加的方法 使用 splice 方法
    var array = []
    var array1 = [1, 2]
    var result = array.concat(100, array1, 200)
    console.log(result)
    console.log(array)
    console.log(array1)
    // 输出:
    [100, 1, 2, 200]
    []
    [1, 2]
    
    // 分割线 ------
    
    var array = [1, 5]
    array.push(3, 10)
    console.log(array
    // 输出:
    [1, 5, 3, 10]
    
    // 分割线 ------
    
    var array = [1, 5, 15]
    array.unshift(3000)
    console.log(array)
    // 输出:
    [3000, 1, 5, 15]
        
    // 分割线 ------
    var array = [1, 2]
    array.push(null)
    array.push(undefined)
    console.log(array)
    // 输出:
    [1, 2, null, undefined]

小结

五、包含 contains includes

OC contains

    - (BOOL)containsObject:(ObjectType)anObject;
    NSArray *array = @[@1, @2, @3, @4, @5];
    BOOL result = [array containsObject:@0];
    if (result) {
        NSLog(@"包含");
    } else {
        NSLog(@"不包含");
    }
    
    BOOL result2 = [array containsObject:@2];
    if (result2) {
        NSLog(@"包含");
    } else {
        NSLog(@"不包含");
    }
    
    // 输出:
    不包含
    包含

Java contains

    // 是否包含元素 e
    public boolean contains(Object o)
    // 是否包含集合 c 中的所有元素 
    public boolean containsAll(Collection<?> c)
    ArrayList arrayList = new ArrayList();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);

    Log.e("数组", String.valueOf(arrayList.contains(1)));
    Log.e("数组", String.valueOf(arrayList.contains(100)));

    ArrayList otherArray = new ArrayList();
    otherArray.add(1);
    otherArray.add(2);
    Log.e("数组", String.valueOf(arrayList.containsAll(otherArray)));

    otherArray.add(100);
    Log.e("数组", String.valueOf(arrayList.containsAll(otherArray)));

    // 输出:
    E/数组: true
    E/数组: false
    E/数组: true
    E/数组: false

JS includes

    /**
     * 方法用来判断一个数组是否包含一个指定的值,如果包含则返回 true,否则返回false
     * searchElement :需要查找的元素
     * fromIndex :可选,从该索引处开始查找 searchElement。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
     * 返回值 :如果包含则返回 true,否则返回false
     * 1、如果fromIndex 大于等于数组长度 ,则返回 false 。该数组不会被搜索
     * 2、如果 fromIndex 为负值,计算出的索引(array.length + fromIndex)将作为开始搜索searchElement的位置。如果计算出的索引小于 0,则整个数组都会被搜索
     */
    arr.includes(searchElement, fromIndex)
    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.includes(1))
    console.log(array.includes(1, 2))
    console.log(array.includes(-200))
    console.log(array.includes(1, 20))
    console.log(array.includes(1, -100))
    // 输出:
    true
    false
    false
    false
    true

小结

六、查找 indexOf lastIndexOf

OC indexOf

    // 获取 anObject 第一次出现的的索引位置,没有获取到返回 NSNotFound
    - (NSUInteger)indexOfObject:(ObjectType)anObject;
    - (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range;
    - (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject;
    - (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;
    
    // todo
typedef NS_OPTIONS(NSUInteger, NSBinarySearchingOptions) {
    NSBinarySearchingFirstEqual = (1UL << 8),
    NSBinarySearchingLastEqual = (1UL << 9),
    NSBinarySearchingInsertionIndex = (1UL << 10),
};
    - (NSUInteger)indexOfObject:(ObjectType)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmp API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)); // binary search
    NSArray *array = @[@1, @2, @3, @4, @5, @2];
    NSLog(@"%ld", [array indexOfObject:@2]);
    NSLog(@"%ld", [array indexOfObject:@100]);
    NSLog(@"%ld", [array indexOfObject:@"2"]);
    NSLog(@"%ld", [array indexOfObject:@"100"]);
    NSLog(@"--------");
    NSLog(@"%ld", [array indexOfObjectIdenticalTo:@2]);
    NSLog(@"%ld", [array indexOfObjectIdenticalTo:@100]);
    NSLog(@"%ld", [array indexOfObjectIdenticalTo:@"2"]);
    NSLog(@"%ld", [array indexOfObjectIdenticalTo:@"100"]);
    
    // 输出:
    1
    9223372036854775807
    9223372036854775807
    9223372036854775807
    --------
    1
    9223372036854775807
    9223372036854775807
    9223372036854775807

Java indexOf lastIndexOf

    // 此列表中第一次出现的指定元素的索引,如果列表不包含该元素,则返回 -1 
    public int indexOf(Object o)
    // 列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1 
    public int lastIndexOf(Object o)
    ArrayList arrayList = new ArrayList();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(2);

    Log.e("数组", String.valueOf(arrayList.indexOf(2)));
    Log.e("数组", String.valueOf(arrayList.indexOf(100)));
    Log.e("数组", String.valueOf(arrayList.lastIndexOf(2)));
    Log.e("数组", String.valueOf(arrayList.lastIndexOf(100)));
    
    // 输出:
    E/数组: 1
    E/数组: -1
    E/数组: 3
    E/数组: -1

JS indexOf lastIndexOf

    /**
     * 方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1
     * searchElement : 要查找的元素
     * fromIndex :可选的参数,默认为0;开始查找的位置。
     * 1、如果 fromIndex 大于或等于数组长度,意味着不会在数组里查找,返回-1
     * 2、如果 fromIndex 为负数,则从 (array.length + fromIndex) 位置处开始查找,计算结果仍然为负数,则从 0 位置处开始查找
     * 返回值 : 首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1
     */
    arr.indexOf(searchElement[, fromIndex = 0])
    
    // 从后往前查找,用法和 indexOf 相同
    arr.lastIndexOf(searchElement[, fromIndex = arr.length - 1])
    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.indexOf(1))
    console.log(array.indexOf(-100))
    console.log(array.indexOf(1, 3))
    console.log(array.indexOf(1, 100))
    console.log(array.indexOf(1, -1))
    console.log(array.indexOf(1, -100))
    // 输出:
    0
    -1
    -1
    -1
    -1
    0
    
    // 分割线 ----
    
    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.lastIndexOf(1))
    console.log(array.lastIndexOf(-100))
    console.log(array.lastIndexOf(1, 3))
    console.log(array.lastIndexOf(1, 100))
    console.log(array.lastIndexOf(1, -1))
    console.log(array.lastIndexOf(1, -100))
    // 输出:
    0
    -1
    0
    0
    0
    -1

小结

七、截取 subarray subList slice

OC subarray

    - (NSArray<ObjectType> *)subarrayWithRange:(NSRange)range;
    - (void)getObjects:(ObjectType _Nonnull __unsafe_unretained [_Nonnull])objects range:(NSRange)range NS_SWIFT_UNAVAILABLE("Use 'subarrayWithRange()' instead");
    NSArray *array = @[@1, @2, @3, @4];
    NSArray *result = [array subarrayWithRange:NSMakeRange(1, 2)];
    NSLog(@"%@", result);
    // 输出:
    (
        2,
        3
    )

Java subList

    /**
     * 截取  fromIndex(包括 )和 toIndex(不包括)之间的内容
     * 1、fromIndex < 0 会 crash
     * 2、toIndex > 0 会 crash
     * 3、fromIndex < toIndex 会 crash
     * 4、fromIndex = toIndex 返回空数组[]
     * 5、fromIndex > size - 1 返回 空数组[]
     */
    public List<E> subList(int fromIndex, int toIndex)
    ArrayList arrayList = new ArrayList();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(2);

    Log.e("数组", String.valueOf(arrayList.subList(0, 2))); // [1, 2]
    Log.e("数组", String.valueOf(arrayList.subList(-1, 2))); // crash
    Log.e("数组", String.valueOf(arrayList.subList(0, 5))); // crash
    Log.e("数组", String.valueOf(arrayList.subList(4, 4))); // []
    Log.e("数组", String.valueOf(arrayList.subList(4, 2))); // crash
    Log.e("数组", String.valueOf(arrayList.subList(2, 2))); // [[]

JS slice

    /**
     * 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。
     * begin : 可选的,默认为0;如果为负数,则从 (array.length + begin) 开始截取
     * end :可选的,默认是截取到数组结尾处;如果为负数,则截取到 (array.length + begin) 位置处
     * 1、如果 end 被省略,则slice 会一直提取到原数组末尾
     * 2、如果 end 大于数组长度,slice 也会一直提取到原数组末尾。
     * 3、如果 begin 大于 end,slice 返回空数组。
     */
    // 截取范围 [0, end] ,即“整个数组”
    arr.slice();
    // 截取范围 [begin, end] ,从 begin 位置处截取(包含该位置),一直到数组末尾
    arr.slice(begin);
    // 截取范围 [begin, end) ,包含 begin 位置元素,不包含 end 位置元素
    arr.slice(begin, end);
    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.slice()) // [1, 5, 15, 20, 30, 100, 200]
    console.log(array.slice(2)) // [15, 20, 30, 100, 200]
    console.log(array.slice(2, 5)) // [15, 20, 30]
    console.log(array.slice(2, 100)) // [15, 20, 30, 100, 200]
    console.log(array.slice(5, 2)) // []
    console.log(array.slice(-5)) // [15, 20, 30, 100, 200]
    console.log(array.slice(-5, -3)) // [15, 20]

小结

八、替换 replace set splice fill

OC replace

    // 可变数组 ----
    // 替换 index 位置处的元素 为 anObject
    - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
    // “源数组” range 范围的元素 用 otherArray 数组的 otherRange 范围内的元素替换
    - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray range:(NSRange)otherRange;
    // “源数组” range 范围的元素 用 otherArray 数组替换
    - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    // “源数组” indexes 位置集合处的元素依次用 objects 数组中相应位置处的元素替换,indexes 的长度 和 objects 长度不一致的话会crash
    - (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray<ObjectType> *)objects;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, nil];
    [array replaceObjectAtIndex:2 withObject:@100];
    [array replaceObjectAtIndex:2 withObject:@"string"];
    NSLog(@"%@", array);
    // 输出:
    (
        1,
        2,
        string,
        4,
        5,
        6
    )
    
     NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, nil];
    NSArray *otherArray = @[@20, @21, @22];
    [array replaceObjectsInRange:NSMakeRange(1, 2) withObjectsFromArray:otherArray];
    NSLog(@"%@", array);
    [array replaceObjectsInRange:NSMakeRange(7, 3) withObjectsFromArray:otherArray range:NSMakeRange(1, 2)];
    NSLog(@"%@", array);

    NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
    [set addIndex:0];
    [set addIndex:1];
    [set addIndex:5];
    [array replaceObjectsAtIndexes:set withObjects:otherArray];
    NSLog(@"%@", array);
    
    // 输出:
    (
        1,
        20,
        21,
        22,
        4,
        5,
        6,
        7,
        8,
        9
    )
    (
        1,
        20,
        21,
        22,
        4,
        5,
        6,
        21,
        22
    )
    (
        20,
        21,
        21,
        22,
        4,
        22,
        6,
        21,
        22
    )

Java set

    // 用指定元素 element 替换列表中指定位置 index 的元素
    public E set(int index, E element)
    ArrayList arrayList = new ArrayList();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(2);

    arrayList.set(1, 100);
    Log.e("数组", String.valueOf(arrayList)); // [1, 100, 3, 2]
    arrayList.set(1, null);
    Log.e("数组", String.valueOf(arrayList)); // E/数组: [1, null, 3, 2]
    arrayList.set(-1, null); // crash
    Log.e("数组", String.valueOf(arrayList)); 

JS fill splice

    /**
     * 用一个固定值填充一个数组中从起始索引到终止索引内的全部元素
     * value : 用来填充数组元素的值
     * start :可选的,起始索引,默认值为0
     * end : 可选的,终止索引,默认值为 this.length
     * 填充范围是一个左闭右开区间,[start, end),包含 start ,不包含 end 
     * 如果 start 是个负数, 则开始索引会被自动计算成为 length+start
     * 如果 end 是个负数, 则结束索引会被自动计算成为 length+end
     */
    arr.fill(value[, start[, end]])
    
    /**
     * 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。
     * start :指定修改的开始位置(从0计数
     *      1、如果超出了数组的长度,则从数组末尾开始添加内容
     *      2、如果是负值,则表示从 (array.length + start) 开始,
     *      3、若只使用start参数而不使用deleteCount、item,如:    array.splice(start) ,表示删除[start,end]的元素。
     * deleteCount : 可选的,整数,表示要移除的数组元素的个数。
     * item1, item2, ... :可选的,要添加进数组的元素
     */
    array.splice(start)
    array.splice(start, deleteCount) 
    array.splice(start, deleteCount, item1, item2, ...)
    var array = [1, 2, 3, 4]
    array.fill(100) // [100, 100, 100, 100]
    array.fill(100, 1, 3) // [1, 100, 100, 4]
    array.fill(100, 1, 1) // [1, 2, 3, 4]
    array.fill(100, 1, 0) // [1, 2, 3, 4]
    array.fill(100, -2, -1) // [1, 2, 100, 4]
    
    // 分割线 ----
        var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.splice(4)) // [1, 5, 15, 20]
    console.log(array) // [1, 5, 15, 20]
    // -------
    console.log(array.splice(-4)) // [20, 30, 100, 200]
    console.log(array) // [1, 5, 15]
    // -------
    console.log(array.splice(100)) // []
    console.log(array) // [1, 5, 15, 20, 30, 100, 200]

    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.splice(4, 2)) // [30, 100]
    console.log(array) // [1, 5, 15, 20, 200]
    // -------
    console.log(array.splice(-4, 2)) // [20, 30]
    console.log(array) // [1, 5, 15, 100, 200]
    // -------
    console.log(array.splice(100, 2)) // []
    console.log(array) // [1, 5, 15, 20, 30, 100, 200]

    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.splice(4, 2, "add")) // [30, 100]
    console.log(array) // [1, 5, 15, 20, "add", 200]
    // -------
    console.log(array.splice(-4, 2, "add")) // [20, 30]
    console.log(array) // [1, 5, 15, "add", 100, 200]
    // -------
    console.log(array.splice(100, 2, "add")) // []
    console.log(array) // [1, 5, 15, 20, 30, 100, 200, "add"]

小结

九、删除 remove removeAll clear pop shift

OC remove

    // 可变数组 -----
    // 删除最后一个元素
    - (void)removeLastObject;
    // 删除 index 位置处的元素
    - (void)removeObjectAtIndex:(NSUInteger)index;
    // 删除所有的元素
    - (void)removeAllObjects;
    // 删除“所有”的 anObject 元素
    - (void)removeObject:(ObjectType)anObject;
    // 删除 range 范围内的“所有”的 anObject 元素
    - (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
    - (void)removeObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;
    - (void)removeObjectIdenticalTo:(ObjectType)anObject;
    - (void)removeObjectsFromIndices:(NSUInteger *)indices numIndices:(NSUInteger)cnt API_DEPRECATED("Not supported", macos(10.0,10.6), ios(2.0,4.0), watchos(2.0,2.0), tvos(9.0,9.0));
    // 删除 otherArray 数组内包含的元素
    - (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray;
    // 删除 range 范围内的元素
    - (void)removeObjectsInRange:(NSRange)range;
    - (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, nil];
    [array removeLastObject];
    NSLog(@"%@", array);
    NSLog(@"------");
    
    [array removeObjectAtIndex:1];
    NSLog(@"%@", array);
    NSLog(@"------");

    [array removeAllObjects];
    NSLog(@"%@", array);
    NSLog(@"------");
    
    // 输出:
    (
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8
    )
    ------
    (
        1,
        3,
        4,
        5,
        6,
        7,
        8
    )
    ------
    (
    )
    ------
    
    // 我是分割线 ------------
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
    [array removeObject:@2];
    NSLog(@"%@", array);
    // 输出:
    (
        1,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        3,
        4,
        5
    )
    
     NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
    [array removeObject:@2 inRange:NSMakeRange(0, 5)];
    NSLog(@"%@", array);
    // 输出:
    (
        1,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5
    )
    
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
    [array removeObjectsInArray:@[@1, @5]];
    NSLog(@"%@", array);
    // 输出:
    (
        2,
        3,
        4,
        6,
        7,
        8,
        9,
        2,
        3,
        4
    )
    
     NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
    [array removeObjectsInRange:NSMakeRange(0, 5)];
    NSLog(@"%@", array);
    // 输出:
    (
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5
    )
    
     NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
    NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
    [set addIndex:0];
    [set addIndex:1];
    [set addIndex:5];
    [array removeObjectsAtIndexes:set];
    NSLog(@"%@", array);
    // 输出:
    (
        3,
        4,
        5,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5
    )

Java remove removeAll clear

    // 删除 index 位置处的元素,index 超过范围会 crash 
    public E remove(int index)
    
    // 移除此列表中"首次"出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动。
    public boolean remove(Object o)
    
    // 删除 所有在集合 c 中的元素
    public boolean removeAll(Collection<?> c)
    // 移除所有的元素
    public void clear()
    ArrayList arrayList = new ArrayList();
    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(2);

    arrayList.remove(1);
    Log.e("数组", String.valueOf(arrayList));
    // 输出:
    E/数组: [1, 3, 2]
    
    // 分割线 ------
    
    ArrayList arrayList = new ArrayList();
    arrayList.add("a");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("b");

    arrayList.remove("b");
    Log.e("数组", String.valueOf(arrayList));
    // 输出:
    E/数组: [a, c, b]
    
    // 分割线 ------
    
    ArrayList arrayList = new ArrayList();
    arrayList.add("a");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("b");

    arrayList.clear();
    Log.e("数组", String.valueOf(arrayList));
    // 输出:
    E/数组: []
    
    // 分割线 ------
    
    ArrayList otherList = new ArrayList();
    otherList.add("a");
    otherList.add("b");
    otherList.add("x");

    ArrayList arrayList = new ArrayList();
    arrayList.add("a");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("b");

    arrayList.removeAll(otherList);
    Log.e("数组", String.valueOf(arrayList));
    // 输出:
    E/数组: [c]

JS pop shift

    // 方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度
    arr.pop()
        
    // 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
    arr.shift()
    
    // 删除 index 位置处元素用 splice 方法
    var array = [1, 5, 15, 20, 30, 100, 200]
    array.pop()
    console.log(array)
    // 输出:
    [1, 5, 15, 20, 30, 100]
    
    // 分割线 ---------
    
    var array = [1, 5, 15, 20, 30, 100, 200]
    array.shift()
    console.log(array)
    // 输出:
    [5, 15, 20, 30, 100, 200]

小结

十、排序 sort

OC sort

    @property (readonly, copy) NSData *sortedArrayHint;
    
    // 使用函数排序
    - (NSArray<ObjectType> *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType, ObjectType, void * _Nullable))comparator context:(nullable void *)context;
    - (NSArray<ObjectType> *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType, ObjectType, void * _Nullable))comparator context:(nullable void *)context hint:(nullable NSData *)hint;
    
    // 使用SEL排序
    - (NSArray<ObjectType> *)sortedArrayUsingSelector:(SEL)comparator;
    - (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    - (NSArray<ObjectType> *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    // 可变数组 ----
    - (void)sortUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType,  ObjectType, void * _Nullable))compare context:(nullable void *)context;
    - (void)sortUsingSelector:(SEL)comparator;
    - (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    - (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    // 多个条件的排序
    - (NSArray<ObjectType> *)sortedArrayUsingDescriptors:(NSArray<NSSortDescriptor *> *)sortDescriptors;    // returns a new array by sorting the objects of the receiver
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@200, @20, @50, @30, @1, nil];
    [array sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    NSLog(@"%@", array);
    // 输出 :
     (
        1,
        20,
        30,
        50,
        200
    )

Java sort

    // 集合的排序
    Collections.sort
    public void sort(Comparator<? super E> c)
    ArrayList arrayList = new ArrayList();
    arrayList.add("x");
    arrayList.add("d");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("a");
//        Collections.sort(arrayList, new Comparator() {
//            @Override
//            public int compare(Object o1, Object o2) {
//                return o1.toString().compareTo(o2.toString());
//            }
//        });
//
//        Log.e("数组", String.valueOf(arrayList));

    arrayList.sort(new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            return o1.toString().compareTo(o2.toString());
        }
    });
    Log.e("数组", String.valueOf(arrayList));
    
    // 输出:上面两种排序方法结果是一样的
    E/数组: [a, b, c, d, x]

JS sort

    // 根据字符串Unicode码点排序
    arr.sort() 
  /**
   * 根据自定的函数 compareFunction 进行排序;
   * 1、如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前
   * 2、如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变
   * 3、如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前
   */
    arr.sort(compareFunction)
    var fruit = ['cherries', 'apples', 'bananas'];
    fruit.sort(); 
    console.log(fruit)
    // 输出:
    ["apples", "bananas", "cherries"]
    
    // 分割线 ----
    var numbers = [4, 2, 5, 1, 3];
    numbers.sort(function (a, b) {
      return a - b;
    });
    console.log(numbers)
    // 输出:
    [1, 2, 3, 4, 5]

小结

十一、比较/相等 Equal ==

OC Equal

    - (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray;
    NSArray *array = @[@1, @2, @3, @4];
    NSArray *otherArray = @[@1, @2, @3, @4];
    NSArray *otherArray2 = @[@"1", @"2", @"3", @"4"];
    NSArray *otherArray3 = @[@1, @2];

    if ([array isEqualToArray:otherArray]) {
        NSLog(@"相等");
    } else {
        NSLog(@"不相等");
    }
    
    if ([array isEqualToArray:otherArray2]) {
        NSLog(@"相等");
    } else {
        NSLog(@"不相等");
    }
    
    if ([array isEqualToArray:otherArray3]) {
        NSLog(@"相等");
    } else {
        NSLog(@"不相等");
    }
    
    // 输出:
    相等
    不相等
    不相等

Java equals

    // 将指定的对象与此列表进行相等性比较。当且仅当指定的对象也是一个列表,两个列表具有相同的大小,而且两个列表中所有相应的元素对都 相等 时,才返回 true。
    public boolean equals(Object o)
    ArrayList arrayList = new ArrayList();
    arrayList.add("x");
    arrayList.add("d");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("a");

    ArrayList otherList = new ArrayList();
    otherList.add("a");
    otherList.add("b");
    otherList.add("x");

    ArrayList arrayList2 = new ArrayList();
    arrayList2.add("x");
    arrayList2.add("d");
    arrayList2.add("b");
    arrayList2.add("c");
    arrayList2.add("a");

    Log.e("数组", String.valueOf(arrayList.equals(otherList)));
    Log.e("数组", String.valueOf(arrayList.equals(arrayList2)));
    // 输出:
    E/数组: false
    E/数组: true

JS ==

    ==
    var array = ['a', 'b', 'c']
    var other = ['z', 'x', 'y']
    console.log(array == other) // false
    console.log(array == array) // true

小结

十二、连接 join

OC Joined

    // 数组中的元素 通过字符串 separator 连接
    - (NSString *)componentsJoinedByString:(NSString *)separator;
    NSArray *array = @[@1, @2, @3, @4, @5];
    NSString *result = [array componentsJoinedByString:@"+"];
    NSLog(@"%@", result);
    // 输出:
    1+2+3+4+5

Java 无直接方法

    没有直接的方法,需要自己处理
    一、循环语句拼接字符串
    ArrayList arrayList = new ArrayList();
    arrayList.add("x");
    arrayList.add("d");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("a");

    String separator = "+";
    StringBuffer sb = new StringBuffer("");
    for (int i = 0; i < arrayList.size(); i++) {
        Object ob = arrayList.get(i);
        sb.append(ob.toString());
        if (i != arrayList.size() - 1) {
            sb.append(separator);
        }
    }
    Log.e("数组", sb.toString());
    // 输出:
    E/数组: x+d+b+c+a

JS join

    // 默认为 ","
    str = arr.join()
    // 分隔符 === 空字符串 ""
    str = arr.join("")
    // 分隔符
    str = arr.join(separator)
    var array = [1, 5, 15, 20, 30, 100, 200]
    console.log(array.join())
    console.log(array.join(""))
    console.log(array.join("+"))
    // 输出:
    1,5,15,20,30,100,200
    15152030100200
    1+5+15+20+30+100+200

小结

十三、反转 reverse

OC reverse

    - (NSEnumerator<ObjectType> *)reverseObjectEnumerator;
    NSArray *array = @[@1, @2, @3, @4, @5];
    NSArray *result = [[array reverseObjectEnumerator] allObjects];
    NSLog(@"%@", result);
    // 输出:
    (
        5,
        4,
        3,
        2,
        1
    )

Java reverse

    // 集合的反转方法
    Collections.reverse
    ArrayList arrayList = new ArrayList();
    arrayList.add("x");
    arrayList.add("d");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("a");

    Collections.reverse(arrayList);
    Log.e("数组", String.valueOf(arrayList));
    // 输出:
    E/数组: [a, c, b, d, x]

JS reverse

    arr.reverse()
    var array = [1, 2, 3, 4]
    var result = array.reverse()
    console.log(result)
    // 输出:
    [4, 3, 2, 1]

小结

十四、交换 exchange

OC exchange

    // 可变数组 ----
    - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, nil];
    [array exchangeObjectAtIndex:0 withObjectAtIndex:2];
    NSLog(@"%@", array);
    // 输出:
    (
        3,
        2,
        1,
        4
    )

Java 无直接方法

    // 没有直接方法,思路如下,和 js 类似
    1、取出 index 和 otherIndex 位置处的元素 indexElement ,otherIndexElement
    2、删除 index 位置处的元素,插入 otherIndexElement  (也可以进行替换操作)
    3、删除 otherIndex 位置处的元素,插入 indexElement (也可以进行替换操作)
    ArrayList arrayList = new ArrayList();
    arrayList.add("x");
    arrayList.add("d");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("a");

    int index = 1;
    int otherIndex = 3;
    Object indexElement = arrayList.get(index);
    Object otherIndexElement = arrayList.get(otherIndex);

    arrayList.set(index, otherIndexElement);
    arrayList.set(otherIndex, indexElement);
    Log.e("数组", String.valueOf(arrayList));
    // 输出 :
    E/数组: [x, c, b, d, a]

JS 无直接方法

    没有直接的方法实现,思路如下
    1、取出 index 和 otherIndex 位置处的元素 indexElement ,otherIndexElement
    2、删除 index 位置处的元素,插入 otherIndexElement
    3、删除 otherIndex 位置处的元素,插入 indexElement
  var array = [1, 2, 3, 4, 5]
  var index = 1
  var otherIndex = 3
  var indexElement = array[index]
  var otherIndexElement = array[otherIndex]
  array.splice(index, 1, otherIndexElement)
  array.splice(otherIndex, 1, indexElement)
  console.log(array)
  // 输出:
  [1, 4, 3, 2, 5]

小结

十五、写入/读取 write init

OC write init

    // 写入 ,11.0 之后可以使用
    - (BOOL)writeToURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
    // 写入,后续会被废弃
    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
    - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
    
    // 读取,11.0 之后可以使用
    - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error  API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) NS_SWIFT_UNAVAILABLE("Use initializer instead");
    // 读取,后续会被废弃掉
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
    - (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
    - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
    // 写入 ----
    NSArray *array = @[@1, @2, @3, @4];
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *file = [filePath stringByAppendingPathComponent:@"array.plist"];
    [array writeToFile:file atomically:YES];
    
    NSError *error;
    [array writeToURL:[NSURL fileURLWithPath:file] error:&error];
    if (!error) {
        NSLog(@"写入成功");
    } else {
        NSLog(@"写入失败");
    }
    // 输出:
    写入成功
    
    // 读取 : 参考初始化的 file 或 url 方法

Java

JS

小结

十六、遍历 make Perform enumerate for循环语句 forEach for...of

OC makePerformenumerate, for循环语句

    // for..in 遍历
     for (<#type *object#> in <#collection#>) {
            <#statements#>
     }
    // SEL 遍历
    - (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
    - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
    
    // block 遍历
    - (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    // block 遍历,NSEnumerationConcurrent : 并发;NSEnumerationReverse : 反向;
    - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    // block 遍历,s 索引集合的元素
    - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    - (NSUInteger)indexOfObjectPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    - (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    - (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));

    - (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    - (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    - (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
     NSArray *array = @[@1, @2, @3, @4, @5];
    for (NSNumber *ob in array) {
        NSLog(@"%@", ob);
    }
    // 输出:
    1
    2
    3
    4
    5

    // 分割线 ---------

    NSArray *array = @[@1, @2, @3, @4];
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%ld : %@", idx, obj);
    }];
    NSLog(@"-----");
    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%ld : %@", idx, obj);

    }];
    NSLog(@"-----");
    [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%ld : %@", idx, obj);
        
    }];
    NSLog(@"-----");
    NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
    [set addIndex:0];
    [set addIndex:2];
    [set addIndex:3];
    [array enumerateObjectsAtIndexes:set options:0 usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%ld : %@", idx, obj);

    }];
    
    // 输出:
    2018-02-27 13:11:41.886616+0800 HYFoundation[26729:24088389] 0 : 1
2018-02-27 13:11:41.886756+0800 HYFoundation[26729:24088389] 1 : 2
2018-02-27 13:11:41.886857+0800 HYFoundation[26729:24088389] 2 : 3
2018-02-27 13:11:41.886971+0800 HYFoundation[26729:24088389] 3 : 4
2018-02-27 13:11:41.887069+0800 HYFoundation[26729:24088389] -----
2018-02-27 13:11:41.887174+0800 HYFoundation[26729:24088389] 3 : 4
2018-02-27 13:11:41.887275+0800 HYFoundation[26729:24088389] 2 : 3
2018-02-27 13:11:41.887380+0800 HYFoundation[26729:24088389] 1 : 2
2018-02-27 13:11:41.887484+0800 HYFoundation[26729:24088389] 0 : 1
2018-02-27 13:11:41.887593+0800 HYFoundation[26729:24088389] -----
2018-02-27 13:11:41.887728+0800 HYFoundation[26729:24088389] 0 : 1
2018-02-27 13:11:41.887734+0800 HYFoundation[26729:24088493] 1 : 2
2018-02-27 13:11:41.887748+0800 HYFoundation[26729:24088492] 2 : 3
2018-02-27 13:11:41.887755+0800 HYFoundation[26729:24088514] 3 : 4
2018-02-27 13:11:41.888169+0800 HYFoundation[26729:24088389] -----
2018-02-27 13:11:41.888415+0800 HYFoundation[26729:24088389] 0 : 1
2018-02-27 13:11:41.888603+0800 HYFoundation[26729:24088389] 2 : 3
2018-02-27 13:11:41.888784+0800 HYFoundation[26729:24088389] 3 : 4
2018-02-27 13:11:41.887728+0800 HYFoundation[26729:24088389] 0 : 1
2018-02-27 13:11:41.887734+0800 HYFoundation[26729:24088493] 1 : 2
2018-02-27 13:11:41.887748+0800 HYFoundation[26729:24088492] 2 : 3
2018-02-27 13:11:41.887755+0800 HYFoundation[26729:24088514] 3 : 4
`[26729:24088493]` , `[26729:24088492]`, `[26729:24088514]` ,这些事变化的,即时并发执行
`NSEnumerationReverse` 表示`反向`遍历,即`从后往前`遍历
- 

Java forEach for循环语句

    `forEach` `for循环语句`
    ArrayList arrayList = new ArrayList();
    arrayList.add("x");
    arrayList.add("d");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("a");

    for (Object ob: arrayList) {
        Log.e("数组", String.valueOf(ob));
    }
    Log.e("数组", "---------");
    for (int i = 0; i < arrayList.size(); i++) {
        Object ob = arrayList.get(i);
        Log.e("数组", String.valueOf(ob));
    }
    // 输出:
    E/数组: x
    E/数组: d
    E/数组: b
    E/数组: c
    E/数组: a
    E/数组: ---------
    E/数组: x
    E/数组: d
    E/数组: b
    E/数组: c
    E/数组: a

JS forEach for...of for循环语句

    /**
     * 方法对数组的每个元素执行一次提供的函数
     * callback : 在数组每一项上执行的函数。调用时使用参数 (currentValue, index, array)。
     * thisArg : 可选参数。当执行回调 函数时用作this的值(参考对象)。
     * 返回值 : 没有返回值,undefined.
     */
    array.forEach(callback(currentValue, index, array){
        //do something
    }, this)
    array.forEach(callback[, thisArg])
    
    // 具体见下面的例子
    for...of
    var array = [1, 5, 15, 20, 30, 100, 200]
    array.forEach(function (element, index, array) {
      console.log("index: " + index + " value: " + element)
    })
    // 输出:
    index: 0 value: 1
    index: 1 value: 5
    index: 2 value: 15
    index: 3 value: 20
    index: 4 value: 30
    index: 5 value: 100
    index: 6 value: 200
    
    // 分割线 ----
     var arr = ['w', 'y', 'k', 'o', 'p'];
    for (var letter of arr) {
      console.log(letter);
    }
    // 输出:
    w
    y
    k
    o
    p

小结

十七、其他

OC

    // 在“源”数组中每个元素 和 otherArray 中的元素比较,找出第一个相同的对象
    - (nullable ObjectType)firstObjectCommonWithArray:(NSArray<ObjectType> *)otherArray;
    NSArray *array = @[@1, @2, @3, @4, @5];
    NSArray *otherArray = @[@3, @2];
    id object = [array firstObjectCommonWithArray:otherArray];
    NSLog(@"%@", object);
    
    NSArray *otherArray2 = @[@10, @11];
    id object2 = [array firstObjectCommonWithArray:otherArray2];
    NSLog(@"%@", object2);
    
    // 输出:
    2
    (null)

Java

JS

    // 判断 obj 是不是数组
    Array.isArray(obj)
    
    // 方法测试数组的所有元素是否都通过了指定函数的测试。
    arr.every(callback[, thisArg])
    console.log(Array.isArray([]))
    console.log(Array.isArray([1, 2]))
    console.log(Array.isArray("123"))
    console.log(Array.isArray(987))
    // 输出:
    true
    true
    false
    false
    
    // 分割线 ------
    
    var array = [1, 5, 15]
    var result = array.every(isBigEnough)
    console.log(result)
    function isBigEnough(value, index, array) {
        return value >= 10;
    }
    // 输出:
    false

小结

最后

相同点

  1. 通过下标获取元素 [index]
  2. 索引下标 从 0 开始,到 count - 1ocjava 超过范围会 crash

不同点

  1. 数组的定义
    // oc / c / c++
    dataType arrayRefVar[];
    如:
    NSString *strings[3];   // c
    NSArray *arr = @[@1, @2, @3, @4]; // oc
    
    // java
    dataType[] arrayRefVar;
    int[] numbers = new int[3];

    // js
    var array = [1, 2, 3, 4, 5]
  1. 空值
    // oc 添加空值 nil 会crash
    
    // java
    ArrayList arrayList = new ArrayList(20);
    arrayList.add(null);
    Log.e("数组", arrayList.toString());
    Log.e("数组", String.valueOf(arrayList.size()));
    // 输出:
    E/数组: [null]
    E/数组: 1
    
    // js 添加 `null`  `undefined` 不会报错
    var array = [1, 2]
    array.push(null)
    array.push(undefined)
    console.log(array)
    // 输出:
    [1, 2, null, undefined]

oc

  1. 有序集合 : NSArrayNSMutableArray
    无序集合 :
  2. 数组的下标从 0 开始,范围为 0count - 1,超过范围会 crash
  3. oc 空数组 @[] 获取下标 0crash
  4. 数组中的元素类型是对象类型不能为基本数据类型(如数字)

java

  1. 类有
  1. 数组中的元素类型是对象类型,也可以为基本数据类型(如数字)

js

  1. 类有
  1. 数组中的元素类型是对象类型,也可以为基本数据类型(如数字)
上一篇下一篇

猜你喜欢

热点阅读