数组合并
以合并两个数组为例,有以下方法:
①System中提供了一个native静态方法arraycopy(),可以使用这个方法来实现数组之间的复制。
**System.arrayCopy()**方法的参数说明:
/**
*Object src: 原数组
*int srcPos : 从元数据的起始位置开始
*Object dest : 目标数组
*int destPos : 目标数组的开始起始位置
*int length : 要copy的数组的长度
**/
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
具体代码例子:
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("please input Array:");
String input = sc.nextLine();
String[] in = input.split(" ");
int[] array = new int[in.length];
for(int i=0;i<in.length;i++)
array[i] = Integer.parseInt(in[i]);
int[] lizi = {1,2,3,4};
ArrayMerge(array,lizi);
}
public static void ArrayMerge(int[] array1,int[] array2){
int[] res = new int[array1.length+array2.length];
System.arraycopy(array1, 0, res, 0,array1.length);
System.arraycopy(array2, 0, res, array1.length, array2.length);
for(int num:res)
System.out.print(num+" ");
}
控制台输出为:
②使用java.util.Arrays包中的Arrays.copyOf()方法。
/**
*Object表示复制某一类型的数组
*length表示复制后新数组的大小
**/
Arrays.copyOf(Object[] ob,int length)
下面是具体例子:
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("please input Array:");
String input = sc.nextLine();
String[] in = input.split(" ");
int[] array = new int[in.length];
for(int i=0;i<in.length;i++)
array[i] = Integer.parseInt(in[i]);
int[] lizi = {1,2,3,4};
MergeArray(array,lizi);
}
public static void MergeArray(int[] array1,int[] array2){
for(int i=0;i<array2.length;i++){
array1 = Arrays.copyOf(array1,array1.length+1);
array1[array1.length-1] = array2[i];
}
for(int num:array1)
System.out.print(num+" ");
}
控制台输出为:
数组中的删除(删除数组中某个/某些元素)
①删除元素的位置已知是n,删除后的数组顺序改变:
/*
* 已知要删除的元素位置n
* 然后删除此元素
*/
public static void delete(int n,int[] array){
//把最后一个元素替代指定的元素
array[n-1] = array[array.length-1];
//数组缩容,借此删除最后一个元素
array = Arrays.copyOf(array, array.length-1);
for(int num:array)
System.out.print(num+" ");
}
②已知删除元素的值为n,删除后数组的相对顺序不变:
/*
* 已知要删除的元素是n
* 在Array[]数组中遍历,把与n不等的元素复制进一个新的数组中
* 最后完成删除操作
*/
public static void del(int n,int[] array){
int[] res = new int[0];
//遍历array寻找与n不等的元素并写入新数组中
for(int i=0;i<array.length;i++)
if(array[i]!=n){
res = Arrays.copyOf(res, res.length+1);
res[res.length-1] = array[i];
}
for(int num:res)
System.out.print(num+" ");
}
③采用list中的remove()方法来删除元素。
public static void main(String[] args){
String[] str = {"H","hello","s","H","sad"};
de("H",str);
}
/**
* 已知要删除的字符串为n
* 采用将原数组中为n的元素设置为与原数组无关的值,比如为“*”
* 然后定义一个list列表,调用list的remove()方法删除所有为(“*”)的元素
* 最后将list列表转换给一个新定义的中间数组,并赋值给它
* 最后完成删除数组中的元素
* @param n
* @param array
*/
public static void de(String n,String[] array){
for(int i=0;i<array.length;i++)
if(array[i]==n)
array[i] = "*";
//定义一个list列表,并循环赋值
ArrayList<String> list = new ArrayList<String>();
for(int i=0;i<array.length;i++)
list.add(array[i]);
//删除list列表中所有的空值
while (list.remove("*"));
while (list.remove(""));
String res[] = new String[list.size()];
for(int i=0;i<list.size();i++)
res[i] = list.get(i);
for(String num:res)
System.out.print(num+" ");
}
控制台输出为:
数组的全排列
思路:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
例如:将 数组 { 1,2,3}进行全排列
首先,我们需要知道当只有一个元素进行全排列的时候,全排列就等于它本身。
这个数组的全排列就是需要将 每个元素放到数组首部,然后将剩下的元素进行全排列,依照此思路我们可以用递归很快的写出代码。
public static void main(String[] args) {
int[] array={1,2,3,4};
AllSort(array, 0, array.length-1);
}
/**
*@m 数组array的开头begin
*@n 数组array的末尾end
**/
public static void AllSort(int[] array,int m,int n){
//只有一个元素时,直接输出
if(m==n){
System.out.println(Arrays.toString(array));
return;
}
//把子数组的第一个元素依次和第二个、第三个元素交换位置
for(int i=m;i<=n;i++){
swap(array,m,i );
//递归剩余的元素
AllSort(array, m+1, n);
//交换回来
swap(array,m,i );
}
}
public static void swap(int[] array,int a,int b){
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}