我有network
和favoriteAnimals
,它看起来像这样:
我有一个函数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;
}
}
编辑:我认为我不是用动物检查动物,而是检查邻居的名字。试图解决这个问题。
答案 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);
如果满足上一行的条件,我们知道当前人是动物行家,所以我们将其添加到结果列表中。