Arrays里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索)。
toString 返回数组的字符串形式
Arrays.toString(arr)
sort排序(自然排序和定制排序)
import java.util.Arrays;
import java.util.Comparator;
public class ArraysMethod01 {
public static void main(String[] args) {
//演示 toString方法的使用
Integer[] integers = {1,2,5};
//遍历数组
// for (int i = 0; i < integers.length; i++) {
// System.out.println(integers[i]);
// }
//直接使用Arrays.toString方法,显示数组
System.out.println(Arrays.toString(integers));
//演示 sort方法的使用
Integer[] arr = {1,-1,0,8,7,98};
// Arrays.sort(arr);//默认排序方法
//1. 可以直接使用冒泡排序,也可以直接使用Arrays提供的sort方法排序
//2. 因为数组是引用类型,所以通过sort排序后,会直接影响到实参 arr
//3. sort重载的,也可以通过传入一个接口 Comparator 实现定制排序
//4. 调用 定制排序 时,传入两个参数 (1) 排序的数组 arr
// (2) 实现了 Comparator接口的匿名内部类,要求实现 compare方法
//5. 这里体现了接口编程的方式,看看源码
//(1) Arrays.sort(arr,new Comparator(){...});
//(2) 最终到 TimSort类的 private static <T> void binarySort(T[] a, int lo, int hi, int start,
// Comparator<? super T> c){}
//(3) 执行到 binarySort方法的代码,会根据动态绑定机制 c.compare()执行我们传入的
// 匿名内部类的 compare()
// while (left < right) {
// int mid = (left + right) >>> 1;
// if (c.compare(pivot, a[mid]) < 0)
// right = mid;
// else
// left = mid + 1;
// }
//(4)new Comparator() {
// @Override
// public int compare(Object o1, Object o2) {
// Integer i1 = (Integer) o1;
// Integer i2 = (Integer) o2;
// return i2 - i1;
// }
// }
//(5) public int compare(Object o1, Object o2) 返回的值 >0 还是 <0
// 会影响整个排序结果,这就充分体现了 接口编程 + 动态绑定 + 匿名内部类的综合使用
// 将来的底层框架和源码的使用方式,会非常常见
//定制排序
Arrays.sort(arr, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
return i2 - i1;
}
});
System.out.println("=====排序后=====");
System.out.println(Arrays.toString(arr));
}
}
//运行结果:
/*[1, 2, 5]
=====排序后=====
[98, 8, 7, 1, 0, -1]
*/
binarySearch 通过二分搜索进行查找,要求必须排好序
int index = Arrays.binarySearch(arr,568);
copyOf 数组元素的复制
Integer[] newArr = Arrays.copyOf(arr,arr.length);
fill 数组元素的填充
Integer[] num = new Integer[]{9,3,2};
Arrays.fill(num,99);
equals 比较两个数组元素内容是否完全一致
boolean equals = Arrays.equals(arr,arr2);
asList 将一组值,转换成list
List<Integer> asList = Arrays.asList(2,3,4,5,6,1);
System.out.println("asList = " + asList);
import java.util.Arrays;
import java.util.List;
public class ArraysMethod02 {
public static void main(String[] args) {
Integer[] arr = {1,2,90,123,567};
//(1) binarySearch 通过二分收搜索法进行查找,要求必须排好的
//1. 使用 binarySearch 二叉查找
//2. 要求该数组必须是有序的,如果该数组时无序的,不能使用binarySearch
//3. 如果数组中不存在该元素,就返回 return -(low + 1);
//low 是该元素如果存在应该在的位置 下面 568 对应的 low 就是 5,所以返回-6
int index = Arrays.binarySearch(arr,568);
System.out.println("index = " + index);
//(2) copyOf 数组元素的复制
//1. 从arr数组中,拷贝 arr.length - 1 个元素到 newArr 数组中
//2. 如果拷贝的长度 > arr.length 就在新数组的后面 增加 null
//3. 如果拷贝长度 < 0 就抛出异常 NegativeArraySizeException
//4. 该方法的底层使用的是 System.arraycopy()
Integer[] newArr = Arrays.copyOf(arr,arr.length-1);
Integer[] newArr2 = Arrays.copyOf(arr,arr.length + 1);
// Integer[] newArr3 = Arrays.copyOf(arr,-1); //这里会抛出异常
System.out.println("=======拷贝执行完毕后=========");
System.out.println(Arrays.toString(newArr));
System.out.println(Arrays.toString(newArr2));
//(3) fill 数组元素的填充
//使用 99 去填充 num数组,可以理解成是替换原来的数组元素
Integer[] num = new Integer[]{9, 3, 2};
Arrays.fill(num,99);
System.out.println("======num数组填充后========");
System.out.println(Arrays.toString(num));
//(4) equals 比较两个元素内容是否完全一致
Integer[] arr2 = {1, 2, 90, 123};
//1. 如果 arr 和 arr2 数组元素一样,则方法返回true
//2. 如果不是完全一样,就返回 false
boolean equals = Arrays.equals(arr, arr2);
System.out.println("equals = " + equals);
//(5) asList 将一组值,转换成list
//1. asList方法,会将 (2,3,4,5,6,1)数据转成一个List集合返回
//2. asList 编译类型 List(接口)
// 运行类型 java.util.Arrays#ArrayList 即Arrays的静态内部类
List asList = Arrays.asList(2, 3, 4, 5, 6, 1);
System.out.println("asList = " + asList);
System.out.println("asList的运行类型" + asList.getClass());
}
}
//运行结果:
/*
index = -6
=======拷贝执行完毕后=========
[1, 2, 90, 123]
[1, 2, 90, 123, 567, null]
======num数组填充后========
[99, 99, 99]
equals = false
asList = [2, 3, 4, 5, 6, 1]
asList的运行类型class java.util.Arrays$ArrayList
*/
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at
我正在尝试循环哈希数组。当我到达获取枚举器开始循环的位置时,出现以下错误:undefinedmethod`[]'fornil:NilClass我的代码如下所示:defextraireAttributs(attributsParam)classeTrouvee=falsescanTrouve=falseownerOSTrouve=falseownerAppTrouve=falseresultat=Hash.new(0)attributs=Array(attributsParam)attributs.eachdo|attribut|#CRASHESHERE!!!typeAttribut=a
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_
我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,
我有以下数组:arr=[1,3,2,5,2,4,2,2,4,4,2,2,4,2,1,5]我想要一个包含前三个奇数元素的数组。我知道我可以做到:arr.select(&:odd?).take(3)但我想避免遍历整个数组,而是在找到第三个匹配项后返回。我想出了以下解决方案,我相信它可以满足我的要求:my_arr.each_with_object([])do|el,memo|memo但是有没有更简单/惯用的方法来做到这一点? 最佳答案 使用lazyenumerator与Enumerable#lazy:arr.lazy.select(&:o
以前没见过这个,但我想知道如何在Ruby中找到二维数组的两条对角线之和。假设您有一个简单的数组,包含3行和3列。array=[1,2,3,4,5,6,7,8,9]我可以通过使用将它分成三个一组array.each_slice(3).to_a现在是[1,2,3],[4,5,6],[7,8,9][1,2,3][4,5,6][7,8,9]在这种情况下,对角线是1+5+9=153+5+7=15所以总和为15+15=30我想我可以做类似的事情diagonal_sum=0foriin0..2forjin0..2diagonal_sum+=array[i][j]endend
我一直在努力学习如何处理由数组组成的数组。假设我有这个数组:my_array=[['ORANGE',1],['APPLE',2],['PEACH',3]我将如何找到包含'apple'的my_array索引并删除该索引(删除子数组['APPLE',2]因为'apple'包含在该索引的数组中)?谢谢-我非常感谢这里的帮助。 最佳答案 您可以使用Array.select过滤掉项目:>>a=[['ORANGE',1],['APPLE',2],['PEACH',3]]=>[["ORANGE",1],["APPLE",2],["PEACH",3