在输入中我有一些字符串:“今天下雪知道”,这里我有3个字,所以我必须解析它们是这样的:每个字符我必须与所有其他字符比较,并总结多少相同的字符这些单词有,例如“o”字母将是2(从“今天”和“下雪”)或“w”字母将是2(从“知道”和“下雪”)。之后,我必须用字母的数字(转换为字母格式)替换这些字符。结果应为“13111 133211 1332”。
我做了什么?
首先我要录一些字和
public void inputStringsForThreads () {
boolean flag;
do {
// will invite to input
stringToParse = Input.value();
try {
flag = true;
// in case that found nothing , space , number and other special character , throws an exception
if (stringToParse.equals("") | stringToParse.startsWith(" ") | stringToParse.matches(".*[0-9].*") | stringToParse.matches(".*[~`!@#$%^&*()-+={};:',.<>?/'_].*"))
throw new MyStringException(stringToParse);
else analizeString(stringToParse);
}
catch (MyStringException exception) {
stringToParse = null;
flag = false;
exception.AnalizeException();
}
}
while (!flag);
}
我消除了单词之间的空格,并且从这些单词中只有一个
static void analizeString (String someString) {
// + sign treat many spaces as one
String delimitator = " +";
// words is a String Array
words = someString.split(delimitator);
// temp is a string , will contain a single word
temp = someString.replaceAll("[^a-z^A-Z]","");
System.out.println("=============== Words are : ===============");
for (int i=0;i<words.length;i++)
System.out.println((i+1)+")"+words[i]);
}
所以我尝试用所有单词中的所有字母来比较部分中的每个单词(每个单词都用字母分隔),但我不知道如何计算相同字母的数量以及用每个字母的正确数字替换字母后? ??有什么想法吗?
// this will containt characters for every word in part
char[] motot = words[id].toCharArray();
// this will containt all characters from all words
char[] notot = temp.toCharArray();
for (int i =0;i<words[i].length();i++)
for (int j=0;j<temp.length ;j++)
{
if (i == j) {
System.out.println("Same word");
}
else if (motot[i] == notot[j] ) {
System.out.println("Found equal :"+lol[i]+" "+lol1[j]);
}}
答案 0 :(得分:3)
为了计算,您可能希望使用Map<Character, Integer> counter
java.util.HashMap
。如果使用计数器中的特定键(字符)获取值(整数)为“非空”,那么您的值为++(利用自动装箱)。否则在柜台中放入一个新条目(char,1)。
用数字替换字母应该相当容易。
答案 1 :(得分:0)
最好像这样使用模式匹配:
最初......
private Matcher matcher;
Pattern regexPattern = Pattern.compile( pattern );
matcher = regexPattern.matcher("");
要匹配多个模式。
private final String[] patterns = new String [] {/* instantiate patterns here..*/}
private Matcher matchers[];
for ( int i = 0; i < patterns.length; i++) {
Pattern regexPattern = Pattern.compile( pattern[i] );
matchers[i] = regexPattern.matcher("");
}
然后匹配模式..你这样做..
if(matcher.reset(charBuffer).find() ) {//matching pattern.}
进行多重匹配检查。
for ( int i = 0; i < matchers.length; i++ ) if(matchers[i].reset(charBuffer).find() ) {//matching pattern.}
不要使用字符串匹配,效率不高。
始终使用CharBuffer而不是String。
答案 2 :(得分:0)
这是一些C#代码(与Java相似):
void replace(string s){
Dictionary<char, int> counts = new Dictionary<char, int>();
foreach(char c in s){
// skip spaces
if(c == ' ') continue;
// update count for char c
if(!counts.ContainsKey(c)) counts.Add(c, 1);
else counts[c]++;
}
// replace characters in s
for(int i = 0; i < s.Length; i++)
if(s[i] != ' ')
s[i] = counts[s[i]];
}
注意第二个循环中的不可变字符串。可能想要使用某种StringBuilder
。
答案 3 :(得分:0)
这是一个仅适用于小写字符串的解决方案。可怕的可怕代码,但我试图看看我能写出多少行代码。
public static String letterCount(String in) {
StringBuilder out = new StringBuilder(in.length() * 2);
int[] count = new int[26];
for (int t = 1; t >= 0; t--)
for (int i = 0; i < in.length(); i++) {
if (in.charAt(i) != ' ') count[in.charAt(i) - 'a'] += t;
out.append((in.charAt(i) != ' ') ? "" + count[in.charAt(i) - 'a'] : " ");
}
return out.substring(in.length());
}