Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:What';这是使用Java8API对非连续字符串的子集进行排序的更快方法_Java_String_Algorithm_Sorting - Fatal编程技术网

Java:What';这是使用Java8API对非连续字符串的子集进行排序的更快方法

Java:What';这是使用Java8API对非连续字符串的子集进行排序的更快方法,java,string,algorithm,sorting,Java,String,Algorithm,Sorting,我有这个Java代码片段 String str = "acxrabdz"; int[] pos = {1, 2, 1, 3, 4, 1, 2, 1}; 其中,pos中的相等值表示str中的对应字符属于同一子集。我想按字典的降序对每个子集中的字符进行排序。在本例中,子集为 1:{a,pos:0},{x,pos:2},{b,pos:5},{z,pos:7} 2:{{c,pos:1},{d,pos:6} 3:{{r,pos:3} 4:{a,pos:4} 和有序子集 1:{z,pos:0},{x,p

我有这个Java代码片段

String str = "acxrabdz"; 
int[] pos = {1, 2, 1, 3, 4, 1, 2, 1};
其中,
pos
中的相等值表示
str
中的对应字符属于同一子集。我想按字典的降序对每个子集中的字符进行排序。在本例中,子集为
1:{a,pos:0},{x,pos:2},{b,pos:5},{z,pos:7}

2:{{c,pos:1},{d,pos:6}

3:{{r,pos:3}

4:{a,pos:4}

和有序子集
1:{z,pos:0},{x,pos:2},{b,pos:5},{a,pos:7}

2:{{d,pos:1},{c,pos:6}

3:{{r,pos:3}

4:{a,pos:4}

答案将是
String ans=“zdxrabca”
我只想获得最终字符串,而不是中间子集。

我如何使用最快的Java 8方法解决这个问题?如果可能的话,这里有一种方法可以让您直接使用预先分配大小的额外存储来解决这个问题。它假定
pos[]
数组中的所有值都在1到N(包括)的范围内,其中N是
str
中的字符数

算法非常简单。有关正在发生的事情的解释,请参见注释

char[] str = "acxrabdz".toCharArray();
int[] pos = {1, 2, 1, 3, 4, 1, 2, 1};
int[] len = new int[pos.length];
// Count how many characters are in each group
for (int n : pos) {
    len[n-1]++;
}
// Pre-allocate space for each group of characters
char[][] tmp = new char[pos.length][];
for (int i = 0 ; i != pos.length ; i++) {
    if (len[i] != 0) {
        tmp[i] = new char[len[i]];
    }
}
// Scatter characters from the string into their group arrays
int[] tpos = new int[pos.length];
for (int i = 0 ; i != pos.length ; i++) {
    int p = pos[i]-1;
    tmp[p][tpos[p]++] = str[i];
}
// Sort each individual group in ascending order
for (int i = 0 ; i != pos.length ; i++) {
    if (tmp[i] != null) {
        Arrays.sort(tmp[i]);
    }
}
// Put characters back into the string starting at the back
for (int i = 0 ; i != pos.length ; i++) {
    int p = pos[i]-1;
    str[i] = tmp[p][--tpos[p]];
}

根据您的解释,正确答案应该是
adcrzxba
。请更新解释或显示您当前的算法。另外,非升序=降序:)根据dasblinkenlight的评论,@Titan你能解释为什么“zdxrabca”是唯一可以接受的答案,而“zxbadcra”是错误的吗?@dasblinkenlight wrt“非升序”与“降序”—不需要唯一性。“非升序”是指任何非升序的顺序。字符“acb”是按非升序排列的,尽管它们绝对不是按降序排列的。对不起。我已将排序类型更改为降序,并解释了该示例。@FabianBarney不可能使用Java字符串,因为它们是不可变的。