计算 Java 中两个数组中匹配的字符串数
Count number of strings that match in two arrays in Java
给定两个字符串数组 a 和 b,每个都按字母顺序排列,我想return计算两个数组中匹配的字符串的数量。
public int countMatch(String[] a, String[] b) {
}
我的目标是能够调用如下方法;
countMatch({"apple", "banana", "xylophone"}, {"banana", "carrot", "dog", "xray", "xylophone"});
这应该 return int 值 2,因为有两个字符串匹配每个数组("banana" 和 "xylophone")。
可能重要的是要注意,数组将始终按字母顺序排列,如果这有助于解决问题的话。
一旦对这些数组进行排序,您就可以执行以下操作:
您将有两个变量:i
和 j
。 First 将遍历第一个数组,second 遍历第二个。
然后你比较a[i]
和b[j]
。
如果它们相等,则匹配,并且您可以提高两个索引。
如果它们不相等,那么 advance index 是 word 中较小的(if a[i] < b[j]
advance i
else j
)。
试试这个
public final class StringArrayMatcher{
public int findMatchCount(final String [] a,final String [] b){
/*
If a has more than one entries that matches to a string in b, it's also considered as accountable.
*/
int matchCount = 0;
for(String x_element : a){
for(String y_element : b){
if(x_element.equals(y_element)) ++matchCount;
}
}
return matchCount;
}
public static void main(String[] args) {
System.out.format("Total matches = %d",new StringArrayMatcher().findMatchCount(new String[]{"apple", "banana", "xylophone"}, new String[]{"banana", "carrot", "dog", "xray", "xylophone"}));
}
}
除非最终性能是一个问题,否则请忽略它们已排序的事实。将 a[] 中的所有值放入 HashSet。循环 b[] 并计算集合中包含的数量。
您可以创建一个简单的方法,例如:
public int countMatch(String[] a, String[] b) {
List<String> list1 = new ArrayList(Arrays.asList(a));
List<String> list2 = Arrays.asList(b);
list1.retainAll(list2);
return list1.size();
}
如果你想把两个匹配的词恰好数一次,不管它们是否出现,就像你说的;试试这个代码
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
import java.util.List;
public final class StringArrayMatcher{
public int findMatchCount(final String [] a,final String [] b){
int matchCount = 0;
Set<String> setA = new HashSet<>(Arrays.asList(a));
List<String> setB = Arrays.asList(b);
for(String value1 : setA){
for(String value2 : setB){
if(value1.equals(value2)){ ++matchCount; break; }
}
}
return matchCount;
}
public static void main(String[] args) {
System.out.format("Total matches = %d",new StringArrayMatcher().findMatchCount(new String[]{"apple"}, new String[]{"apple","apple"}));
}
}
*Set 的使用会自动删除数组中的重复单词。
如果你完全不关心字母顺序。那么就很简单了,你需要两个循环来完成这项工作,即你需要比较所有可能的对。在您的示例中,您需要进行 3*5 次比较才能得出结论。
public int countMatch(String[] a, String[] b) {
int count = 0;
for(int i=0; i<a.length; i++){
for(int j=0; j<b.length; i++){
if(a[i].equals(b[i])){
count++;
break;
}
}
}
return count;
}
但是如果考虑到字母顺序,可以简单的改进一下
public int countMatch1(String[] a, String[] b) {
int count = 0;
int cursor = 0;
for(int i=0; i<a.length; i++){
for(int j=cursor; j<b.length; i++){
if(a[i].equals(b[i])){
count++;
cursor = j;
break;
}
}
}
return count;
}
在这种情况下,您可以使用变量游标来记住上次搜索数组 a[i] 时停止的位置,然后在下一次搜索 a[i+1] 时,您可以简单地从游标开始,而不是从游标开始重新开始,因为光标之前的所有先前的肯定不能匹配 a[i+1]。
我的代码如下:
public class Test {
public static int findMatchCount(final String [] a,final String [] b){
int matchCount = 0;
for(int i = 0, j = 0;i < a.length && j < b.length;){
int res = a[i].compareTo(b[j]);
if(res == 0){
matchCount++;
i++;
j++;
}else if(res < 0){
i++;
}else{
j++;
}
}
return matchCount;
}
public static void main(String[] args){
String[] a = {"apple", "apple"};
String[] b = {"apple", "apple"};
System.out.println(findMatchCount(a,b));
}
}
您可以使用 for
循环比较这些数组,并将第一个数组的第一个索引与所有第二个数组索引进行比较,然后继续与其他第一个数组索引进行比较。像这样:
public class Ber {
public static void main( String[] arg){
String[] abc1 = {"1", "7", "j", "kolo", "7", "1"};
String[] abc2 = {"2", "n", "m", "2", "n", "kolo"};
for (int i = 0, j = 0; j < abc2.length; i++) {
if (abc1[i].equals(abc2[j])){
System.out.println("found first index: "+i+" second index: "+j);
break;
} else if (i == abc1.length-1) {
i = 0;
j++;
}
System.out.println("searching... "+i+" "+j);
}
}
}
你可能会看到这样的东西:
searching... 0 0
searching... 1 0
searching... 2 0
searching... 3 0
searching... 4 0
searching... 0 1
searching... 1 1
searching... 2 1
searching... 3 1
searching... 4 1
searching... 0 2
searching... 1 2
searching... 2 2
searching... 3 2
searching... 4 2
searching... 0 3
searching... 1 3
searching... 2 3
searching... 3 3
searching... 4 3
searching... 0 4
searching... 1 4
searching... 2 4
searching... 3 4
searching... 4 4
searching... 0 5
searching... 1 5
searching... 2 5
found first index: 3 second index: 5
使用集合和列表执行此操作的好方法。如果您迟早要使用 java,无论如何您都会开始使用它们,最好尽快开始,稍后再研究它们的工作原理。
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
public final class Match{
public int countMatch( String [] a, String [] b){
Set<String> set = new HashSet<>(Arrays.asList(a));
set.retainAll(Arrays.asList(b));
System.out.println("The number of matches is " + set.size());
return set.hashCode();
}
public static void main(String[] args) {
String[] a = {"apple", "banana", "xylophone"};
String[] b = {"banana", "carrot", "dog", "xray", "xylophone"};
Match countMatch = new Match();
countMatch.countMatch(a, b);
}
}
此函数为您完成工作,在本例中,它的工作是计算两个匹配词恰好一次,而不管它们出现的次数。
让我们看看它是如何工作的:
它遍历 2 个数组,只比较每个数组中最后一次出现的迭代项,不计算重复项。
最后,为了进行一些优化,我们跳过检查第一个数组项和第二个数组项是否较小。
此函数仅在 2 个数组按字母顺序排序时有效。
public int commonTwo(String[] a, String[] b) {
int c = 0;
for(int i = 0; i < a.length; i++){
for(int j = 0; j < b.length; j++){
if(a.length - i >= 2 && a[i].equals(a[i+1])) break;
if(b.length - j >= 2 && b[j].equals(b[j+1])) continue;
int cmp = a[i].compareTo(b[j]);
if(cmp == 0) {
c++;
} else if(cmp < 0){
break;
}
}
}
return c;
}
样本:
public class Main {
public static void main(String[] args) {
String[] a = {"a", "c", "x"};
String[] b = {"a", "b", "c", "x", "z"};
int count = commonTwo(a, b);
System.out.println(count); // prints 3
String[] a2 = {"a", "a", "b", "b", "c"};
String[] b2 = {"a", "b", "b", "b", "c"};
int count = commonTwo(a2, b2);
System.out.println(count); // prints 3
}
}
给定两个字符串数组 a 和 b,每个都按字母顺序排列,我想return计算两个数组中匹配的字符串的数量。
public int countMatch(String[] a, String[] b) {
}
我的目标是能够调用如下方法;
countMatch({"apple", "banana", "xylophone"}, {"banana", "carrot", "dog", "xray", "xylophone"});
这应该 return int 值 2,因为有两个字符串匹配每个数组("banana" 和 "xylophone")。
可能重要的是要注意,数组将始终按字母顺序排列,如果这有助于解决问题的话。
一旦对这些数组进行排序,您就可以执行以下操作:
您将有两个变量:i
和 j
。 First 将遍历第一个数组,second 遍历第二个。
然后你比较a[i]
和b[j]
。
如果它们相等,则匹配,并且您可以提高两个索引。
如果它们不相等,那么 advance index 是 word 中较小的(if a[i] < b[j]
advance i
else j
)。
试试这个
public final class StringArrayMatcher{
public int findMatchCount(final String [] a,final String [] b){
/*
If a has more than one entries that matches to a string in b, it's also considered as accountable.
*/
int matchCount = 0;
for(String x_element : a){
for(String y_element : b){
if(x_element.equals(y_element)) ++matchCount;
}
}
return matchCount;
}
public static void main(String[] args) {
System.out.format("Total matches = %d",new StringArrayMatcher().findMatchCount(new String[]{"apple", "banana", "xylophone"}, new String[]{"banana", "carrot", "dog", "xray", "xylophone"}));
}
}
除非最终性能是一个问题,否则请忽略它们已排序的事实。将 a[] 中的所有值放入 HashSet。循环 b[] 并计算集合中包含的数量。
您可以创建一个简单的方法,例如:
public int countMatch(String[] a, String[] b) {
List<String> list1 = new ArrayList(Arrays.asList(a));
List<String> list2 = Arrays.asList(b);
list1.retainAll(list2);
return list1.size();
}
如果你想把两个匹配的词恰好数一次,不管它们是否出现,就像你说的;试试这个代码
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
import java.util.List;
public final class StringArrayMatcher{
public int findMatchCount(final String [] a,final String [] b){
int matchCount = 0;
Set<String> setA = new HashSet<>(Arrays.asList(a));
List<String> setB = Arrays.asList(b);
for(String value1 : setA){
for(String value2 : setB){
if(value1.equals(value2)){ ++matchCount; break; }
}
}
return matchCount;
}
public static void main(String[] args) {
System.out.format("Total matches = %d",new StringArrayMatcher().findMatchCount(new String[]{"apple"}, new String[]{"apple","apple"}));
}
}
*Set 的使用会自动删除数组中的重复单词。
如果你完全不关心字母顺序。那么就很简单了,你需要两个循环来完成这项工作,即你需要比较所有可能的对。在您的示例中,您需要进行 3*5 次比较才能得出结论。
public int countMatch(String[] a, String[] b) {
int count = 0;
for(int i=0; i<a.length; i++){
for(int j=0; j<b.length; i++){
if(a[i].equals(b[i])){
count++;
break;
}
}
}
return count;
}
但是如果考虑到字母顺序,可以简单的改进一下
public int countMatch1(String[] a, String[] b) {
int count = 0;
int cursor = 0;
for(int i=0; i<a.length; i++){
for(int j=cursor; j<b.length; i++){
if(a[i].equals(b[i])){
count++;
cursor = j;
break;
}
}
}
return count;
}
在这种情况下,您可以使用变量游标来记住上次搜索数组 a[i] 时停止的位置,然后在下一次搜索 a[i+1] 时,您可以简单地从游标开始,而不是从游标开始重新开始,因为光标之前的所有先前的肯定不能匹配 a[i+1]。
我的代码如下:
public class Test {
public static int findMatchCount(final String [] a,final String [] b){
int matchCount = 0;
for(int i = 0, j = 0;i < a.length && j < b.length;){
int res = a[i].compareTo(b[j]);
if(res == 0){
matchCount++;
i++;
j++;
}else if(res < 0){
i++;
}else{
j++;
}
}
return matchCount;
}
public static void main(String[] args){
String[] a = {"apple", "apple"};
String[] b = {"apple", "apple"};
System.out.println(findMatchCount(a,b));
}
}
您可以使用 for
循环比较这些数组,并将第一个数组的第一个索引与所有第二个数组索引进行比较,然后继续与其他第一个数组索引进行比较。像这样:
public class Ber {
public static void main( String[] arg){
String[] abc1 = {"1", "7", "j", "kolo", "7", "1"};
String[] abc2 = {"2", "n", "m", "2", "n", "kolo"};
for (int i = 0, j = 0; j < abc2.length; i++) {
if (abc1[i].equals(abc2[j])){
System.out.println("found first index: "+i+" second index: "+j);
break;
} else if (i == abc1.length-1) {
i = 0;
j++;
}
System.out.println("searching... "+i+" "+j);
}
}
}
你可能会看到这样的东西:
searching... 0 0
searching... 1 0
searching... 2 0
searching... 3 0
searching... 4 0
searching... 0 1
searching... 1 1
searching... 2 1
searching... 3 1
searching... 4 1
searching... 0 2
searching... 1 2
searching... 2 2
searching... 3 2
searching... 4 2
searching... 0 3
searching... 1 3
searching... 2 3
searching... 3 3
searching... 4 3
searching... 0 4
searching... 1 4
searching... 2 4
searching... 3 4
searching... 4 4
searching... 0 5
searching... 1 5
searching... 2 5
found first index: 3 second index: 5
使用集合和列表执行此操作的好方法。如果您迟早要使用 java,无论如何您都会开始使用它们,最好尽快开始,稍后再研究它们的工作原理。
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
public final class Match{
public int countMatch( String [] a, String [] b){
Set<String> set = new HashSet<>(Arrays.asList(a));
set.retainAll(Arrays.asList(b));
System.out.println("The number of matches is " + set.size());
return set.hashCode();
}
public static void main(String[] args) {
String[] a = {"apple", "banana", "xylophone"};
String[] b = {"banana", "carrot", "dog", "xray", "xylophone"};
Match countMatch = new Match();
countMatch.countMatch(a, b);
}
}
此函数为您完成工作,在本例中,它的工作是计算两个匹配词恰好一次,而不管它们出现的次数。
让我们看看它是如何工作的:
它遍历 2 个数组,只比较每个数组中最后一次出现的迭代项,不计算重复项。 最后,为了进行一些优化,我们跳过检查第一个数组项和第二个数组项是否较小。
此函数仅在 2 个数组按字母顺序排序时有效。
public int commonTwo(String[] a, String[] b) {
int c = 0;
for(int i = 0; i < a.length; i++){
for(int j = 0; j < b.length; j++){
if(a.length - i >= 2 && a[i].equals(a[i+1])) break;
if(b.length - j >= 2 && b[j].equals(b[j+1])) continue;
int cmp = a[i].compareTo(b[j]);
if(cmp == 0) {
c++;
} else if(cmp < 0){
break;
}
}
}
return c;
}
样本:
public class Main {
public static void main(String[] args) {
String[] a = {"a", "c", "x"};
String[] b = {"a", "b", "c", "x", "z"};
int count = commonTwo(a, b);
System.out.println(count); // prints 3
String[] a2 = {"a", "a", "b", "b", "c"};
String[] b2 = {"a", "b", "b", "b", "c"};
int count = commonTwo(a2, b2);
System.out.println(count); // prints 3
}
}