我试图找出两个字符串是否是彼此的字谜:
void anagram(String a, String b) {
List<Character> bcopy = new ArrayList<Character>();
for (int i = 0; i < b.length(); i++)
bcopy.add(b.charAt(i));
if (b.length() == 0 || a.length() == 0) {
System.out.println("Exit");
} else {
for (int i = 0; i < a.length(); i++) {
char temp = a.charAt(i);
if (bcopy.contains(temp)) {
System.out.println("match found" + temp);
bcopy.remove(temp);
}
for (char j : bcopy) {
System.out.println("Values" + j);
}
}
}
}
我一直在remove()行遇到越界错误。当我按对象可用性搜索时,有人可以告诉我如何到达阵列界限吗?我在这里缺少什么?
答案 0 :(得分:4)
问题是您正在使用int
- remove()
版本char temp
,因为int
被视为bcopy.remove(Character.valueOf(temp));
。这是一个解决方法:
char[] c1 = a.toCharArray();
char[] c2 = b.toCharArray();
Arrays.sort(c1);
Arrays.sort(c2);
return Arrays.equals(c1, c2); // true -> anagram, false -> not anagram
顺便说一下,测试字谜的更好方法是:
{{1}}
答案 1 :(得分:1)
还有另一种算法可能更适合任务。它计算相等长度的字符串的字母频率。 为简单起见,我假设所涉及的所有字符集都可以在一个常见的8位代码页中表示。
void anagram(String a, String b) {
int freqa[256], freqb[256];
if (b.length() == 0 || a.length() == 0) {
System.out.println("Exit");
return;
}
for (int i = 0; i < b.length(); i++) {
freqa[(int) a.charAt(i)]++;
freqb[(int) b.charAt(i)]++;
}
for (i = 0; i < 256; i++) {
if (freqa[i] <> freqb[i]) {
System.out.println("Exit");
return;
}
}
System.out.println("match found: '" + a + "', '" + b + "'");
}
答案 2 :(得分:1)
您的代码有问题。您正在从列表中删除项目,但是循环正在运行'n'次,因为字符串长度为'n'。
因此,如果从列表中删除项目,并且循环计数达到一个从列表中删除索引的数字,它将给出异常。您可以保留计数而不是删除项目。我稍微修改了您的代码,现在可以正常工作了。
请检查
import java.util.ArrayList;
import java.util.List;
class Anagram{
void anagram(String a, String b) {
List<Character> bcopy = new ArrayList<Character>();
int count=0;
for (int i = 0; i < b.length(); i++)
bcopy.add(b.charAt(i));
if (b.length() == 0 || a.length() != b.length()) {
System.out.println("Two strings are not anagram");
} else {
for (int i = 0; i < a.length(); i++) {
char temp = a.charAt(i);
if (bcopy.contains(temp)) {
//System.out.println("match found" + temp);
//bcopy.remove(temp);-- Here list size was reduced but the loop was constant, because list size is less than a.length() now it was giving error
//System.out.println(c);
count++;
}
}
if(count==a.length()) {
System.out.println("Two strings are anagram");
}
else {
System.out.println("Two strings are not anagram");
}
}
}
}
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Anagram a=new Anagram();
a.anagram("abs", "ass");
}
}