我正在为Horspool的算法编写一个Java程序,并且遇到了一些麻烦。我正在尝试创建一个字符数组,将每个字母保存在一个字符串中,但我不希望重复这些字母。现在这是我的代码:
public static void main(String[] args)
{
Scanner scanIn = new Scanner (System.in);
int count = 0;
int count2 = 0;
int inc = 0;
//The text to search for the phrase in
String t = "";
//The phrase/pattern to search for
String p = "";
System.out.println(" ");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("Harspool's Algorithm: ");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(" ");
System.out.println("Please enter the full text: ");
t = scanIn.nextLine();
System.out.println("Please enter the pattern to search for: ");
p = scanIn.nextLine();
char[] text = new char[t.length()];
char[] pattern = new char[p.length()];
char[] alphabet = new char[t.length()];
for (int i = 0; i < alphabet.length; i++)
{
alphabet[i] = ' ';
}
for (int i = 0; i < text.length; i++)
{
text[i] = t.charAt(i);
}
for (int i = 0; i < pattern.length; i++)
{
pattern[i] = p.charAt(i);
}
while (inc < text.length)
{
for (int j = 0; j < text.length; j++)
{
if (text[inc] != alphabet[j])
{
count++;
}
if (count == p.length() - 1 && count2 < text.length)
{
alphabet[count2] = text[inc];
count2++;
count = 0;
inc++;
}
}
}
for (int i = 0; i < alphabet.length; i++)
{
System.out.print(alphabet[i]);
}
}
我认为问题出在while循环中,但我无法弄清楚到底出了什么问题。现在,它将打印出传入的整个字符串,它应该只打印每个字母一次。有人可以帮忙吗?
答案 0 :(得分:3)
使用Set<Character>
而不是计算每个字符的出现次数。集合包含唯一元素,因此您不会有这样的重复。
您还可以Set
或mySet.toArray(new String[mySet.size()]);
mySet.toArray(new String[0]);
转换为数组
答案 1 :(得分:0)
您的代码不易阅读。您可以考虑使用以下算法。
int ccount[256];
int ii;
for(ii=0;ii<256;ii++) ccount[ii]=0;
for (ii = 0; ii < text.length; ii++)
{
ccount[t.charAt(i)%256]++;
}
for (ii = 0; ii<256; ii++) {
if(ccount[ii]>0) System.out.printf("%c", ii);
}
编辑 - 确保ccount
已初始化,并使用%
运算符捕获0-255范围之外的字符。