编程语言对比系列:二、数组的基本使用
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
)
- 小结
- 通过
单个元素
、多个元素
、其他数组NSArray
、文件file
、url
、c 语言数组
构建数组
- 通过
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"]
- 小结
-
Array.from()
,当传入参数为字符串时,可以作为字符串分割数据的方法
-
小结
-
相同点
-
不同点
二、长度 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
- 小结
- 数组为空
nil
,没有元素时,长度为0
- 数组为空
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
-
小结
小结
-
相同点
-
不同点
-
oc
为count
,Java
为size
,JS
为length
-
三、获取 AtIndex
get
array[]
OC AtIndex
,firstObject
, 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
- 小结
- 从数组
array
中获取下标为index
的快捷方式array[index]
,这种方式等价于[array objectAtIndex:index]
- 数组的下标从
0
开始,范围为0
到length - 1
,超过范围会crash
- 从数组
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]));
- 小结
- 数组的下标从
0
开始,范围为0
到size - 1
,超过范围会crash
- 数组的下标从
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
- 小结
-
filter
是查找符合条件的所有
元素
,find
是查找符合条件的第一个
元素
,findIndex
是查找符合条件的第一个
元素的索引
- 索引位置
index
的下标从0
开始,范围为0
到length - 1
,超过范围获取到的是undefined
-
小结
-
相同点
- 如果数组的元素数目为
count
, 则索引位置/下标范围为[0, count - 1]
- 如果数组的元素数目为
-
不同点
-
oc
和java
索引位置超过范围会crash
,js
不会报错,但是获取到的是undefined
-
四、增加 add
insert
addAll
concat
push
unshift
OC add
,insert
- 方法
// 在 “末尾” 添加元素 ,“原来数组”不发生变化,返回一个新的数组
- (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
)
- 小结
-
NSArray
“原来数组”不发生变化,返回新数组 -
NSMutableArray
“原来数组”发生变化 - 添加
nil
、NULL
元素会
crash
- 添加
@[]
、[NSNull null]
元素不会
crash
-
index
超过范围会crash
-
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]
- 小结
-
addAll
方法,添加的集合为null
会crash
-
add
方法,添加的元素为null
不会crash
- 索引位置超过范围会
crash
-
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]
- 小结
- 数组添加
null
undefined
不会报错,并且存在于数组中
- 数组添加
小结
-
相同点
-
oc
和java
索引超过范围会crash
,js
不会
-
-
不同点
-
oc
添加空值nil
、NULL
元素会
crash
-
java
addAll
方法,添加的集合为null
会crash
-
java
add
方法,添加的元素为null
不会crash
-
js
添加空值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
- 小结
- 如果
fromIndex
大于等于数组长度 ,则返回false
。该数组不会被搜索 - 如果
fromIndex
为负值,计算出的索引(array.length + fromIndex)
将作为开始搜索searchElement
的位置。如果计算出的索引小于0
,则整个数组都会被搜索
- 如果
小结
-
相同点
-
不同点
六、查找 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
- 小结
-
indexOf
是从左往右
查找第一个元素的索引位置
-
lastIndexOf
是从右往左
查找第一个元素的索引位置
-
小结
-
相同点
-
不同点
七、截取 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
)
- 小结
- 当
range
超过数组范围时,会crash
- 当
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]
- 小结
- 类似字符串的
slice
方法
- 类似字符串的
小结
-
相同点
-
oc
和java
超过范围会报错
-
-
不同点
八、替换 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
)
- 小结
-
index
或range
超过范围会crash -
replaceObjectsAtIndexes
方法如果indexes
的长度 和objects
长度不一致的话会crash
:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray replaceObjectsAtIndexes:withObjects:]: count of array (3) differs from count of index set (2)'
-
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));
- 小结
-
crash
情况:-
UnsupportedOperationException
- 如果列表不支持set
操作 -
ClassCastException
- 如果指定元素的类不允许它添加到此列表 -
NullPointerException
- 如果指定的元素为null
,并且此列表不允许 null 元素
-
IllegalArgumentException
- 如果指定元素的某些属性不允许它添加到此列表 -
IndexOutOfBoundsException
- 如果索引超出范围( index < 0 || index >= size())
-
-
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"]
- 小结
-
fill
方法当start
>
end
的时候才会进行填充 -
splice
方法根据传入的参数不同表现出不同的状态-
array.splice(start)
从start
位置处开始(包含start位置),一直删除到数组末尾 -
array.splice(start, deleteCount)
从start
位置处开始(包含start位置),删除deleteCount
个元素 -
array.splice(start, deleteCount, item1, item2, ...)
从start
位置处开始(包含start位置),删除deleteCount
个元素,然后再在start
位置处插入元素item1, item2, ...
-
-
小结
-
相同点
-
不同点
九、删除 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]
-
小结
小结
-
相同点
-
oc
方法- (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray;
类似java
方法public boolean removeAll(Collection<?> c)
-
-
不同点
-
oc
中移除某个元素方法- (void)removeObject:(ObjectType)anObject;
是移除所有的anObject
元素; -
java
中public boolean remove(Object o)
是移除第一个出现的元素,移除所有的 使用方法public boolean removeAll(Collection<?> c)
-
十、排序 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
- 小结
- 这是数组“连接”成字符串,对应的字符串分割成数组方法为:
// 根据 指定的字符串 separator 进行分割 - (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator; // 根据 指定的字符集合 separator 进行分割 - (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
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
- 方法
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 方法
- 小结
- 11.0 之后可以使用带有
error
参数的方法,不带error
参数的方法后续会被废弃掉
- 11.0 之后可以使用带有
Java
- 方法
- 例子
-
小结
JS
- 方法
- 例子
-
小结
小结
-
相同点
-
不同点
十六、遍历 make
Perform
enumerate
for循环语句
forEach
for...of
OC make
, Perform
, enumerate
, 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
- 小结
-
NSEnumerationOptions
是一个枚举类型:
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) { NSEnumerationConcurrent = (1UL << 0), NSEnumerationReverse = (1UL << 1), };
NSEnumerationConcurrent
: 表示并发执行, 见上面的例子: -
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
- 小结
-
js
的for...of
类似oc
中的for...in
方法,类似java
的forEach
-
小结
-
相同点
- 都可以使用
for循环语句
进行遍历
- 都可以使用
-
不同点
-
js
的for...of
类似oc
中的for...in
方法,类似java
的forEach
;都是忽略 索引index
,直接获取元素的值
-
十七、其他
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
-
小结
小结
-
相同点
-
不同点
最后
相同点
- 通过下标获取元素
[index]
- 索引下标 从
0
开始,到count - 1
,oc
和java
超过范围会crash
不同点
- 数组的定义
// 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]
- 空值
-
oc
数组添加nil
、NULL
元素会
crash
-
java
数组添加null
不会报错,并且存在于数组中 -
js
数组添加null
undefined
不会报错,并且存在于数组中
// 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
- 有序集合 :
NSArray
和NSMutableArray
无序集合 : - 数组的下标从
0
开始,范围为0
到count - 1
,超过范围会crash
-
oc
空数组@[]
获取下标0
会crash
- 数组中的元素类型是
对象类型
,不能
为基本数据类型(如数字)
java
- 类有
ArrayList
- 数组中的元素类型是
对象类型
,也可以
为基本数据类型(如数字)
js
- 类有
Array
- 数组中的元素类型是
对象类型
,也可以
为基本数据类型(如数字)