【发布时间】:2017-03-30 00:35:19
【问题描述】:
问题
我编写了一个程序来找出给定字符串中字符的大写和小写的所有可能性。
一个例子是, 输入——“ab”/“Ab”等——其中任何一个 输出 - ["ab","Ab","aB","AB"]
代码
算法不正确 - 请检查以下内容。
public static ArrayList<String> permuteUCLC(String a)
{
String s=new String(a.toLowerCase());
ArrayList<String> arr = new ArrayList<>();
arr.add(a);
int l = a.length();
for(int i=0;i<=l;i++)
{
for(int j=i+1;j<=l;j++)
{
arr.add(s.substring(0,i)+s.substring(i,j).toUpperCase()+s.substring(j,l));
}
}
Collections.sort(arr);
Collections.reverse(arr);
return arr;
}
注意
在提出我的算法错误的问题后,我意识到。我会在适当的时候尝试上传正确的算法。
子序列代码(正确代码) 这是查找所有子序列并将它们大写的代码。假设所有字符都是唯一的。如何找到指数 并以功能的方式实现它?
public static void permuteSubsequence(String a)
{
int n=a.length();
for(int i=0;i<(1<<n);i++)
{
String buff="";
for(int j=0;j<n;j++)
{
if(((1<<j)&i)!=0)
{
buff=buff+new Character(a.charAt(j)).toString().toUpperCase();
}
else
{
buff = buff + a.charAt(j);
}
}
System.out.println(buff);
}
}
从上述案例中提取索引。即 1 的索引并将它们大写。
请求
如何使用 Java 流将上述代码转换为函数式风格?
我面临的问题是在 map 方法中模拟索引范围。
另外,有没有办法生成字符串的 Stream 来将相同的字符串复制到所有元素中,类似于IntStream.range(a,b)?
public static List<String> permuteStreams(String a)
{
int l=(int)(Math.pow(2,a.length())-1)
ArrayList<String> al = new ArrayList<>();
for(int i=0;i<=l;i++)
al.add(a);//Generate a stream and copy back into arraylist maybe if possible?
List<String> sl = al.stream()
.map()//incomplete code
.collect(Collectors.toList());
return sl;
}
【问题讨论】:
-
"我编写了一个程序来找出给定字符串的大写和小写的所有排列。"太可怕了,我希望这是一个学术练习。
-
您能详细说明一下吗?声明是不必要的还是问题不清楚?
-
回答你的小问题 - 如果我需要一个包含 X 个不可变对象副本的列表,我会使用
Arrays.fill来填充我想要的大小的数组,然后使用Arrays.asList来获取列出来。 -
像
new Character(a.charAt(j)).toString().toUpperCase()这样的表达真的很可怕。你为什么不寻找一个直接的解决方案,即首先Character.toUpperCase(a.charAt(j))? -
@Sbodd:如果您需要一个包含 X 个对象副本的列表,只需使用
Collections.nCopies(X, object),无需先填充数组……如果您需要X重复 @987654332 的流@,你可以直接在nCopies列表中调用stream(),它的作用与IntStream.range(0, X).mapToObj(ignored -> object)相同……
标签: java algorithm functional-programming java-8 java-stream