我想生成字符串的“子集”并按特定顺序打印输出。 例如,“rum”,我期望输出为 [rum, ru, rm, r, um, u, m] 我的代码如下,现在我的输出是 [rum, ru, rm, um, r, u, m]。如何更改我的代码以使其正常工作?
import java.util.*;
public class SubstringGenerator {
String word;
public SubstringGenerator(String x) { word = x;}
public static void main(String[] args){
SubstringGenerator a = new SubstringGenerator("rum");
List b = a.subsets();
Collections.sort(b, Collections.reverseOrder(Comparator.comparing(String::length)));
System.out.println(b);
}
public List subsets(){
ArrayList<String> subsets = new ArrayList<String>();
int len = word.length();
for (int i = 0; i < Math.pow(2,len); i++){
String a = "";
for (int j = 0; j < len; j++){
if ((i & (int) (Math.pow(2,j))) > 0) a += word.charAt(j) + "";
}
subsets.add(a);
}
return subsets;
}
}
最佳答案
我相信你的排列方法是保留它们全部,然后删除最后一个字母,然后删除倒数第二个,然后是最后两个,倒数第三个,倒数第三个和最后一个,最后三个,依此类推。
所以你所做的就是按长度排列数组列表元素。这不起作用,因为 r 比 um 短,因此将在后面。
我所做的是将子集排列如下:
我创建了一个二进制数来表示哪些字母被保留。数字“1”表示保留该位置的字符,而“0”则表示不保留。我重复了这个过程,从 111 开始一直到 001。
我希望这对您有所帮助,请询问您是否需要进一步的帮助。
import java.util.*;
import java.lang.Math;
public class SubstringGenerator {
String word;
public SubstringGenerator(String x) { word = x;}
public static void main(String[] args){
SubstringGenerator a = new SubstringGenerator("rum");
List b = a.subsets();
System.out.println(b);
}
public List subsets(){
ArrayList<String> subsets = new ArrayList<String>();
int len = word.length();
for (int i = (int)(Math.pow(2,len)-1.0); i >0; i--){
String a = "";
String b= Integer.toBinaryString(i);
while(b.length()!=word.length()) b="0"+b;
for(int j=0; j<b.length(); j++) if (b.charAt(j)=='1') a+=word.substring(j, j+1);
subsets.add(a);
}
return subsets;
}
}
关于java - 如何对从第一个字符开始的字符串数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59240331/