HashMap与<arraylist <string>&gt;作为一个价值,获得AnimalHipsters

时间:2017-06-13 00:36:55

标签: java generics arraylist hashmap

我有networkfavoriteAnimals,它看起来像这样: enter image description here

我有一个函数public ArrayList<String> findAnimalHipsters(HashMap<String,ArrayList<String>> network, HashMap <String,String> favoriteAnimals)

返回动物赶时髦的人的字符串ArrayList,这意味着他们的所有邻居的动物必须与我的动物不同。例如,Dan有Quakka,他的邻居Lior和Rona,他们都有不同于Dan动物的动物。因此,丹是动物时髦。我需要归还所有的动物赶时髦的人。这是我的实现,我输错了,它打印出所有人都是动物赶时髦的人,这是错误的。

MainClass.java

import java.util.ArrayList;

public class MainClass {
    public static void main(String[] args)
    {

        NetWorkApp instance = new NetWorkApp();
        instance.CreateAnimals();
        instance.neighboursForPersons();
        ArrayList<String> animalHipsters = instance.findAnimalHipsters(instance.network, instance.favoriteAnimals);
        for(String st : animalHipsters)
            System.out.print(st + " ");
    }
}

NetWorkApp.java

    import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class NetWorkApp {

    public HashMap <String,String> favoriteAnimals;
    public HashMap<String,ArrayList<String>> network;

    public NetWorkApp()
    {
        this.favoriteAnimals = new HashMap <String,String>();
        network = new HashMap<String,ArrayList<String>>();
    }

    public void CreateAnimals()
    {
        /*Adding elements to favoriteAnimals*/
        favoriteAnimals.put("Dan", "Quakka");
        favoriteAnimals.put("Ella", "Quakka");
        favoriteAnimals.put("Rona", "Dog");
        favoriteAnimals.put("Lior", "Cat");
        favoriteAnimals.put("David", "Dog");
        favoriteAnimals.put("Dor", "Dog");
        favoriteAnimals.put("Rina", "Quakka");
        favoriteAnimals.put("Gil", "Dog");
    }

    public void neighboursForPersons(){


        /*Creating neighbours for every person*/
        ArrayList<String> Dan = new ArrayList<String>();
        Dan.add("Rona");
        Dan.add("Lior");

        ArrayList<String> Ella = new ArrayList<String>();
        Ella.add("Rona");
        Ella.add("Dor");

        ArrayList<String> Rona = new ArrayList<String>();
        Rona.add("Dan");
        Rona.add("Ella");
        Rona.add("Lior");
        Rona.add("Dor");
        Rona.add("Rina");

        ArrayList<String> Lior = new ArrayList<String>();
        Lior.add("Dan");
        Lior.add("Rona");
        Lior.add("Dor");
        Lior.add("Gil");
        Lior.add("Rina");
        Lior.add("David");

        ArrayList<String> David = new ArrayList<String>();
        David.add("Lior");
        David.add("Gil");
        David.add("Rina");

        ArrayList<String> Dor = new ArrayList<String>();
        Dor.add("Ella");
        Dor.add("Rona");
        Dor.add("Rina");

        ArrayList<String> Rina = new ArrayList<String>();
        Rina.add("Dor");
        Rina.add("Rona");
        Rina.add("Lior");
        Rina.add("David");
        Rina.add("Gil");

        ArrayList<String> Gil = new ArrayList<String>();
        Gil.add("Lior");
        Gil.add("David");
        Gil.add("Rina");

        network.put("Dan", Dan);
        network.put("Ella", Ella);
        network.put("Rona", Rona);
        network.put("Lior", Lior);
        network.put("David", David);
        network.put("Dor", Dor);
        network.put("Rina", Rina);
        network.put("Gil", Gil);

    }

    public ArrayList<String> findAnimalHipsters(HashMap<String,ArrayList<String>> network,
            HashMap <String,String> favoriteAnimals)
            {
        boolean found = false;
        ArrayList<String> animalHipsters = new ArrayList<String>();
                // Display elements
                for (Map.Entry<String, String> entry : favoriteAnimals.entrySet()) {
                    String key = entry.getKey();

                    for(Map.Entry<String, ArrayList<String>> entrySecond : network.entrySet()){
                        if(key.equals(entrySecond.getKey())){
                            for(String st : entrySecond.getValue())
                            {
                                if((entry.getValue()).equals(st)) //Match
                                    found = true;
                            }
                            if(!found)
                                animalHipsters.add(key);
                            else 
                                found = !found;
                        }
                    }
                }
                return animalHipsters;  
            }
}

编辑:我认为我不是用动物检查动物,而是检查邻居的名字。试图解决这个问题。

2 个答案:

答案 0 :(得分:1)

部分问题在于:

for(String st : entrySecond.getValue())
{
     if((entry.getValue()).equals(st)) //Match
         found = true;
}

你忽略了之前邻居的价值,所以基本上,你只是在有效地比较你添加的最后一个邻居是否有相同的喜欢的动物。

Collection接口的一部分(由ArrayList实现)是方法contains(Object),它将告诉您Collection是否包含Object。

此外,对于这样的嵌套循环,有时至少最初会将键和值拉出更有意义的名称 - 这将有助于确保您比较正确的值。或者在每个点添加注释以提供帮助。

修改 正如您所提到的,您正在比较动物与人名,因此您需要获取secondEntry值(邻居名称),然后获取他们最喜欢的动物。您也可以使用keySet。试试这个:

// Each person in the network
for(Set<String> name : network.keySet()) 
{
      boolean isHipster = false;
      // Get their neighbours
      ArrayList<String> neighbours = network.get(name);
      // Get their favourite animal
      String favAnimal = favouriteAnimals.get(name);
      for(String st : neighbours ) //Neighbours loop
      {
          // Get their neighbours favourite animal
          String neighboursFavAnimal = favouriteAnimals.get(st);
          // Compare
          if(favAnimal.equals(neighboursFavAnimal))
          {
              //is a hipster
              isHipster = true;
              //Stop comparing as doesnt matter anymore
              break;
          }   
      }
      // If isHipster is still false then add the name.
      if(!isHipster)
          animalHispters.add(name)
 }

答案 1 :(得分:1)

以下是使用Java 8功能的解决方案:

List<String> animalHipsters = new ArrayList<>();
network.forEach((person, neighbours) -> {
    String animal = favoriteAnimals.get(person);
    if (neighbours.stream().map(favoriteAnimals::get).noneMatch(animal::equals)) {
        animalHipsters.add(person);
    }
});
return animalHipsters;

我得到的结果是[Dan, Lior, Rina, Ella]

重要的事情,逐行解释:

network.forEach((person, neighbours) ->

这会迭代network地图。 person是密钥,neighbours是与该密钥匹配的值,即person的实际邻居。

String animal = favoriteAnimals.get(person);

在这里,我们得到了当前人最喜欢的动物。

if (neighbours.stream().map(favoriteAnimals::get).noneMatch(animal::equals))

这是丰富的内容......我们正在流式传输当前的邻居列表,并且对于这些邻居中的每一个(当前person的邻居),我们正在将他/她转换为他/通过Stream.map方法获取她最喜欢的动物(通过从favoriteAnimals地图中获取动物)。最后,我们使用Stream.noneMatch方法,该方法检查邻居中最喜欢的动物是否与当前人最喜欢的动物相等。在自然语言中,如果当前邻居最喜欢的动物没有与当前人最喜欢的动物匹配,则该行可能被视为 ...

animalHipsters.add(person);

如果满足上一行的条件,我们知道当前人是动物行家,所以我们将其添加到结果列表中。