排列规则就是先按字符串数组里的元素不同依次输出 如:如果数组里的元素改成字符串, String[] arr=new String[]{"aa","aa","bc","ad","aa","bc"};想要实现输出结果为(不用排序):输出: aa ab bc aa bc aa 或是输出 aa aa ab bc aa bc 等等
如果改成二维数组的元素, 是否更直观些。排列规则就是先按字符串数组里的元素不同依次输出 如:如果数组里的元素改成字符串, String[][] arr=new String[][]{{"aa","业务1"},{"aa","业务2"},{"bc","业务3"},{"ad","业务4"},{"aa","业务5"},{"bc","业务6"}};想要实现输出结果为(不用排序):输出: aa ab bc aa bc aa 或是输出 aa aa ab bc aa bc 等等
对原数组进行遍历
如果a存在
则把a存在新数组里,原数组把对应的删掉
如果b存在
则把b存在新数组里,原数组把对应的删掉
如果c存在
则把c存在新数组里,原数组把对应的删掉
如果z存在
则把z存在新数组里,原数组把对应的删掉
直到原数组的长度为0,退出。
然后把新数组按顺序打印出来。
public class Test {
public static void main(String[] args) {
char[] arr = new char[] { 'a', 'a', 'c', 'a', 'b', 'b' };
reShortArr(arr);
for(char i : arr){
System.out.print(i + "\t");
} }
public static void reShortArr(char[] arr){
int[] arrNum = initArr(arr);
int index = 0;
while(arrNum[26] > 0){
for(int i = 0; i < arrNum.length - 1; i++){
if(arrNum[i] > 0){
arr[index++] = (char)(i + 97);
arrNum[i]--;
arrNum[26]--;
}
}
}
}
private static int[] initArr(char[] ch)
{
int[] arrNum = new int[27];
for(int i = 0; i < ch.length; i++){
arrNum[ch[i] - 97]++;
}
arrNum[26] = ch.length;
return arrNum;
}
}这个代码的效率可以优化下的,楼主自己改下
String[] arr=new String[]{"aa","aa","bc","ad","aa","bc"};想要实现输出结果为:aa,bc,ad,aa,bc,aa如何实现?
Java里无法改变参数的值,只能改变参数的属性值
按这种方法的话就得自己定义一个类型,含有两个数组。
一个是返回的数组,一个是改变后的新数组
那样就浪费了大量的内存去建数组
解决方案和上一个一样就是新建 hash 而后再读出来
效率上可以优化下 我上边给的代码投机了些,懒的死脑细胞了 呵呵
如:如果数组里的元素改成字符串,
String[] arr=new String[]{"aa","aa","bc","ad","aa","bc"};想要实现输出结果为(不用排序):输出:
aa ab bc
aa bc
aa
或是输出
aa
aa ab bc
aa bc
等等
如:如果数组里的元素改成字符串,
String[][] arr=new String[][]{{"aa","业务1"},{"aa","业务2"},{"bc","业务3"},{"ad","业务4"},{"aa","业务5"},{"bc","业务6"}};想要实现输出结果为(不用排序):输出:
aa ab bc
aa bc
aa
或是输出
aa
aa ab bc
aa bc
等等
何必咬文嚼字呢?就看个思路就成。
先排序,再用LinkedList弹出每一组无重复的序列,直到LinkedList为空。这个算法对有大量重复数据的数组性能不如你那个hash高。
但你的那个算法如果是处理String[]而不是char[]的话,还要做很多改进,因为String.hashCode的顺序不能体现String的顺序,必须先对String排序,再用辅助数组存放HashCode才行。而这个算法写起来会很简洁。
先对arr进行排序
char [][] tmpArr=new char[arr.length][arr.length];
int[] arrIndex=new int[arr.length];
int index=0;
for(int i=0;i<arr.length;i++){//遍历所有的数组
for(int j=0;j<=index;j++){
if(j==index){
++index;
arrIndex[j]=0;
tmpArr[j][arrIndex[j]]=arr[i];
break;
}
if(arr[i]>tmpArr[j][arrIndex[j]]){//这个是按你的规则排序的
++arrIndex[j];
tmpArr[j][arrIndex[j]]=arr[i];
break;
}
}
}
大概思路就是这样啦!
lz的数据可能是动态的,可能需要考虑到'z',那么就需要很多歌集合对象存入,然后再取出!!