2012-05-23 4 views
0

Привет, я принимаю общий счет в двух списках.
Вот мой код.Получение общих пар строк в двух строковых списках

public static int getMatchCount(List<String> listOne, List<String> listTwo) { 
    String valueOne = ""; 
    String valueTwo = ""; 
    int matchCount = 0; 
    boolean isMatchedOnce=false; 

    for (int i = 0; i < listOne.size(); i++) { 
     valueOne = listOne.get(i); 
     isMatchedOnce=false; 
     if (StringUtils.isBlank(valueOne)) 
      continue; 

     for (int j = 0; j < listTwo.size(); j++) { 
      valueTwo = listTwo.get(j); 
      if (StringUtils.isBlank(valueTwo)) 
       continue; 

      if (valueTwo.equals(valueOne) && (!isMatchedOnce)) { 
       matchCount++; 
       listOne.set(i, ""); 
       listTwo.set(j, ""); 
       isMatchedOnce=true; 
      } 
     } 
    } 
    return matchCount; 
} 


    for ex 
listone listTwo 
A   A 
A   B 
B 

Тогда результат 2 не 3
Как их только две общие пары мы можем вынуть.

Но метод очень медленный Любое усовершенствование метода выше, чтобы сделать его быстрым.

+1

Вы хотите подсчитать общие элементы в обоих списках. Я прав? – sgowd

ответ

4

Это должно быть проще работа вокруг:

List<String> listOne = new ArrayList<String>(); 
//add elements 
List<String> listTwo= new ArrayList<String>(); 
//add elements 
List<String> commonList = new ArrayList<String>(listTwo); 
commonList.retainAll(listOne); 
int commonListSize = commonList.size(); 
+0

Спасибо, я понял .. – Abhij

2

Используйте промежуточный сбор и addAll(), retainAll():

Set<String> set = new HashSet<String>(); 
set.addAll(list1); 
set.retainAll(list2); 
int count = set.size(); 
+0

Хорошее пересечение! –

0

может быть, вы можете попробовать это ...

public static int getMatchCount(List<String> listOne, List<String> listTwo) { 
    String valueOne; 
    String valueTwo; 
    int matchCount = 0; 
    boolean isMatchedOnce; 

    //for (int i = 0; i < listOne.size(); i++) { 
    for(String i : listOne){ 
     valueOne = i; 
     isMatchedOnce = false; 
     if (StringUtils.isBlank(valueOne)) { 
      continue; 
     } 

     for (String j : listTwo) { 
      valueTwo = j; 
      if (StringUtils.isBlank(valueTwo)) { 
       continue; 
      } 

      if (valueTwo.equals(valueOne) && (!isMatchedOnce)) { 
       matchCount++; 
       listOne.set(listOne.indexOf(i), ""); 
       listTwo.set(listOne.indexOf(j), ""); 
       isMatchedOnce = true; 
      } 
     } 
    } 
    return matchCount; 
}