列表中的数值很少,因此我需要从左到右匹配每两个序列号/字符。
在stringList
下,我的记录很少,我必须将这些记录与另一个记录wordA
进行比较。
我想匹配每两个序列号/字符,因此如果我输入630102
,它必须返回第三个。如果我输入了630677
,它必须返回第二个数字,因为630677
中没有stringList
,但是这里的第一个4
数字6306
与我的列表匹配值。
下面是我尝试的示例代码。如果您有任何建议,请提供。
String wordA = "630102";
List<String> stringList = new ArrayList<>();
stringList.add("630507"); //1st
stringList.add("630622"); //2nd
stringList.add("6301"); //3rd
stringList.add("63"); //4th
String common = "";
int count1 = 0;
int count2 = 0;
for (int i = 0; i < stringList.size(); i++) {
for (int j = 0; j < wordA.length(); j++) {
if (stringList.get(i).length() > j) {
if (wordA.charAt(j) != stringList.get(i).charAt(j)) {
break;
} else if (wordA.charAt(j) == stringList.get(i).charAt(j)) {
count1++;
if (count1 == 2) {
count2++;
count1 = 0;
}
}
}
}
if (wordA.length() > stringList.get(i).length()) {
common = stringList.get(i);
break;
}
}
System.out.println("common is: " + common);
答案 0 :(得分:2)
基本上有两种基本的解决方法:
对于每个迭代
您非常接近这一点。在这里,您去了:
int maxLength = 0;
int indexOfLongestMatch = -1;
for (int i = 0; i < stringList.size(); i++) { // Iterate the List
String string = stringList.get(i);
int maxIndex = Math.min(wordA.length(), string.length()); // Compare lengths
if (maxIndex >= maxLength) { // Worth to continue?
int commonLength = 0;
for (int j = 0; j < maxIndex; j++) { // Iterate characters
if (string.charAt(j) == wordA.charAt(j)) {
commonLength++; // Any match counts
if (commonLength >= maxLength) { // Check for the new max
maxLength = commonLength; // Register it
indexOfLongestMatch = i; // New index of the max
}
}
}
}
}
stringList
中最长匹配单词的索引为indexOfLongestMatch
(根据您提供的相同输入等于2
),单词为stringList.get(indexOfLongestMatch)
({ {1}}。
正则表达式。正如@YCF_L在这里建议的那样,另一种可能的方式是Regex,它可以帮助您使用模式仅匹配具有常见初始字符的字符串:
6301
要通过输入实现此模式,必须将每个字符6?3?0?1?0?2?
替换为.
,其中$0?
是与点$0
匹配的任何匹配字符。在Regex101
.
然后,您只需在列表上进行一次迭代即可找到最长的匹配字符串及其索引:
Pattern pattern = Pattern.compile(wordA.replaceAll(".", "$0?"));
结果与上面的示例相同。 Matcher matcher;
int indexOfLongestMatch = -1;
int maxLength = 0;
for (int i = 0; i < stringList.size(); i++) { // Iterate the List
matcher = pattern.matcher(stringList.get(i)); // Apply the pattern
if (matcher.matches()) { // Has a match?
int length = matcher.group(0).length();
if (length >= maxLength) { // Check for the new max
maxLength = length; // Register it
indexOfLongestMatch = i; // New index of the max
}
}
}
是找到的索引。
请注意,默认情况下,结果索引设置为indexOfLongestMatch
,而不是列表中的现有索引-这意味着没有字符串以您想要的方式与输入匹配。
答案 1 :(得分:1)
据我了解,您想返回的值是单词中最常见的字符。这是我为您解决的问题:
String wordA = "630677";
List<String> stringList = new ArrayList<>();
stringList.add("630507"); //1st
stringList.add("630622"); //2nd
stringList.add("6301"); //3rd
stringList.add("63"); //4th
String common = "";
int commonCount = 0;
int highestCount = 0;
for(String s : stringList)
{
for(int i = 0; i < wordA.length(); i++) {
if(s.length() > i && s.charAt(i) == wordA.charAt(i)) {
commonCount++;
}
if(s.length() <= i || s.charAt(i) != wordA.charAt(i) || wordA.length() <= i + 1) {
if(commonCount > highestCount) {
highestCount = commonCount;
common = s;
}
commonCount = 0;
break;
}
} }
System.out.println(common.isEmpty() ? "There is no common." : "common is: " + common);
}
编辑:请注意,如果有更多具有相同数量正确字符串的字符串,它将始终从列表中返回第一个字符串。