减少以下代码中的for循环

时间:2016-08-16 23:28:02

标签: java data-structures collections time-complexity

我正在尝试根据用户的直接朋友向用户推荐朋友,并根据他们的频率对其进行排名(即推荐的朋友出现在用户的直接朋友列表中的次数)。以下是解决问题的工作代码。

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 for for循环?

1 个答案:

答案 0 :(得分:1)

比较器的快速提示:在开始时获取您感兴趣的两个值并将它们存储在变量中,这样您在当前最差情况下最多只能执行2次调用而不是6次调用(每次获取) call会散列字符串,所以越少越好。)

至于简化for循环,您是否可以获得朋友的朋友列表并计算该列表中每个朋友的出现次数?然后,删除你已经是朋友的朋友。