2015-04-15 4 views
0

Привет Я пытаюсь сравнить два списка элементов массива. Вроде так:Точки пересечения в середине текста

public class intersection { 
public static void main(String... args) throws Exception { 

    List<String> list1 = new ArrayList<String>(Arrays.asList("This is a test example to help me learn hashsets")); 
    List<String> list2 = new ArrayList<String>(Arrays.asList("test example", "Not returned")); 

    System.out.println(new intersection().intersection(list1, list2)); 

} 


public <T> List<T> intersection(List<T> list1, List<T> list2) { 
    List<T> list = new ArrayList<T>(); 

    for (T t : list1) { 
     if(list2.contains(t)) { 
      list.add(t); 
     } 
    } 

    return list; 
} 
} 

Я хочу, чтобы «тестовый пример» возвращался, поскольку он находится где-то в обоих списках массивов. Извините, забыл сказать, что содержимое списков массивов не может быть изменено. Есть ли способ сделать это ?. Спасибо

+0

Вы должны будете сделать это на отдельные слова, если вы используете список. Else считают String.indexOf – Leon

ответ

0

Там это ошибка:

List<String> list1 = new ArrayList<String>(Arrays.asList("This is a test example to help me learn hashsets")); 

Здесь список будет содержать только один элемент, как «Это тестовый пример, чтобы помочь мне узнать hashsets» является единственным элементом.

Разделите строку на ,.

public class intersection { 
    public static void main(String... args) throws Exception { 

    List<String> list1 = new ArrayList<String>(Arrays.asList("This is a ","test example"," to help me learn hashsets")); 
    List<String> list2 = new ArrayList<String>(Arrays.asList("test example", "Not returned")); 

    System.out.println(new intersection().intersection(list1, list2)); 

    } 


    public <T> List<T> intersection(List<T> list1, List<T> list2) { 
    List<T> list = new ArrayList<T>(); 

    for (T t : list1) { 
     if(list2.contains(t)) { 
      list.add(t); 
     } 
    } 

    return list; 
    } 
} 

Или измените логику пересечения на использование подстроки.

EDIT:

public <T> List<T> intersection(List<T> list1, List<T> list2) { 
    List<T> list = new ArrayList<T>(); 

    for (T t : list2) { 
     for(T l: list1){ 
      if(((String)l).contains((CharSequence)t)){ 
       list.add(t); 
      } 

     } 
    } 

    return list; 
} 
+0

Извините, забыл сказать, что список массивов нельзя редактировать, так как в большем файле они будут текстовыми файлами, которые невозможно отформатировать. извините –

+0

См. отредактированный ответ. – Touchstone

2

Вам необходимо либо проверить отдельные слова

public class intersection { 

    public static void main(String... args) throws Exception { 

     List<String> list1 = new ArrayList<String>(Arrays.asList("This is a test example to help me learn hashsets".split("\\s+"))); 
     List<String> list2 = new ArrayList<String>(Arrays.asList("test example Not returned".split("\\s+"))); 

     System.out.println(new intersection().check(list1, list2)); 

    } 

    public <T> List<T> check(List<T> list1, List<T> list2) { 
     List<T> list = new ArrayList<T>(); 

     for (T t : list1) { 
      if (list2.contains(t)) { 
       list.add(t); 
      } 
     } 

     return list; 
    } 
} 

В качестве альтернативы вы можете выбрать для поиска целой строки для фраз

общественного класса пересечение {

public static void main(String... args) throws Exception { 

    String s1 = "This is a test example to help me learn hashsets"; 
    String[] s2 = new String[] { "test example", "Not returned" }; 

    System.out.println(new intersection().check(s1, s2)); 

} 

public List<String> check(String s1, String[] s2) { 
    List<String> list = new ArrayList<>(); 

    for (String s : s2) { 
     if (s1.contains(s)) { 
      list.add(s); 
     } 
    } 

    return list; 
} 

}

+1

одно предложение @Leon, используйте «\\ s +» вместо «». Поэтому он будет игнорировать большее количество белых пространств, если существует между двумя словами. i.e «» .split («\\ s +») – niks

+0

второе решение не будет проверять отдельные слова, поэтому я не думаю, что это его правильное решение. – niks

+0

Второе решение отлично, поскольку я проверяю всю фразу из строки 2, чтобы быть где-то в строке 1. Я должен был получить более ясное спасибо. за помощь все –

0

Использование Java 8 потоков:

public static <T> List<T> intersection(List<T> list1, List<T> list2) { 
    List<T> list = new ArrayList<>(); 
    Predicate<? super T> con = (t) -> { 
     Predicate<? super T> p = (u) -> u.toString().contains((CharSequence) t); 
     return list1.stream().anyMatch(p); 
    }; 
    list2.stream().filter(con).forEach(list::add); 

    return list; 
} 
Смежные вопросы