2016-08-16 2 views
2

Я пытаюсь получить рекомендации друзей для пользователей на основе их прямых друзей и ранжировать их по их частоте (например, количество раз, когда рекомендуемый друг появился в списках прямых друзей пользователя). Ниже приведен рабочий код для решения проблемы.Уменьшите количество циклов в коде ниже

public List<String> getFriendsRecommendations(String user) 
{ 
    Recommendations rd = new Recommendations(); 
    List<String> result= new ArrayList<String>(); 

    List<String> drfriend = rd.getdirectfriends(user); //return list of direct friend for the user. 

    List<ArrayList<String>> allfriends = new ArrayList<ArrayList<String>>(); 
    Map<String, Integer> mapfriend = new HashMap<String, Integer>(); 

    List<String> userfriend = rd.getfriends(user); //returns the list of all the friends for a given user. 

    int counter =0; 
    for(String s: drfriend) 
    { 
     allfriends.add(new ArrayList<String>(rd.getfriends(s))); 
     rd.intersection(userfriend, allfriends.get(counter), mapfriend); 
     counter++; 

    } 
    result.addAll(mapfriend.keySet()); 

    //Sorting based on the value of hashmap. friend with highest value will be recommended first 
    Collections.sort(result, new Comparator<String>(){ 
     public int compare(String s1, String s2) 
     { 
      if(mapfriend.get(s1) > mapfriend.get(s2)) 
       return -1; 
      else if(mapfriend.get(s1) < mapfriend.get(s2)) 
       return 1; 
      else if(mapfriend.get(s1) == mapfriend.get(s2)) 
      { 
       return s1.compareTo(s2); 
      } 
      return 0; 
     } 
    }); 


    return result; 
} 

public void intersection(List<String> lt1, ArrayList<String> lt2, Map<String, Integer> ranked) 
{ 
    lt2.removeAll(lt1); // ignoring the friends that user is already connected to 

    for(String st: lt2) 
    { 
     boolean val = ranked.containsKey(st); 
     if(val) 
     { 
      int getval = ranked.get(st); 

      ranked.put(st, getval+1); //friend name as a key and the value would be the count. 
     } 
     else 
     { 
      ranked.put(st, 1); 
     } 
    } 
} 

Я хотел бы знать, есть ли более эффективный способ решения вышеуказанной проблемы вместо использования 2 для циклов?

+2

* Я хотел бы знать, есть ли более эффективный способ сделать это? * - делать * что * точно? Кроме того, название вашего вопроса в лучшем случае неоднозначно. –

+0

Попробуйте опубликовать статью об обзоре стека кода –

+0

@JonnyHenly Я хотел бы знать, есть ли способ уменьшить число циклов в приведенном выше коде? – Irfan

ответ

1

Быстрый совет для вашего компаратора. Получите два значения, которые вы хотите сравнить в начале и сохраните их в переменных. Таким образом, вы получите максимум 2 вызова вместо 6 в вашем текущем худшем случае (каждый get call will hash the String, так что меньше - лучше).

Что касается упрощения циклов for, вы можете просто получить список друзей друзей и подсчитать случаи каждого друга в этом списке? Затем после этого удалите друзей, с которыми вы уже знакомы.

+0

Спасибо за быстрый совет. – Irfan

Смежные вопросы