Java 使用HashMap或其他方法在ArrayList中求和

Java 使用HashMap或其他方法在ArrayList中求和,java,arraylist,Java,Arraylist,我想不出来 List<String[]> dogList = new ArrayList<String[]>(); dogList.add(new String[] { "id_tag", "breed", "rank", "nickname"}); dogList.add(new String[] { "t4639", "Akita", "First", "Marshal"}); dogList.add(new String[] { "t4638", "Akita",

我想不出来

List<String[]> dogList = new ArrayList<String[]>();

dogList.add(new String[] { "id_tag", "breed", "rank", "nickname"});
dogList.add(new String[] { "t4639", "Akita", "First", "Marshal"});
dogList.add(new String[] { "t4638", "Akita", "First", "Tom"});
dogList.add(new String[] { "t4637", "Beagle", "First", "Eddy"});
dogList.add(new String[] { "t4636", "Beagle", "Second", "Franky"});
我尝试使用HashMap,但没有成功。

实现一个比较器来检查两个元素是否相等。然后,您可以使用两个for循环来检查特定的狗,如果还有其他具有相同品种和等级的狗,那么简单的算法将在^2上,或者您可以找到在系统实现的方法中使用此比较器的方法


按品种和等级尝试这些狗,然后做一个for循环,将它们添加到dogsTotal中。这将需要Onlogn。您还可以尝试根据数据的对称性创建自己的算法。

嘿,您可以使用uuu作为键来维护HashMap的计数。完成计数后,只需迭代散列映射并使用u作为分隔符分割密钥,以从值中返回品种和排名以及计数值

    List<String[]> dogList = new ArrayList<String[]>();
    dogList.add(new String[] { "id_tag", "breed", "rank", "nickname"});
    dogList.add(new String[] { "t4639", "Akita", "First", "Marshal"});
    dogList.add(new String[] { "t4638", "Akita", "First", "Tom"});
    dogList.add(new String[] { "t4637", "Beagle", "First", "Eddy"});
    dogList.add(new String[] { "t4636", "Beagle", "Second", "Franky"});
    List<String[]> dogTotal = new ArrayList<String[]>();
    HashMap<String,Integer> map = new HashMap<>();
    for(int i=1;i<dogList.size();i++){
        String key = dogList.get(i)[1]+"_"+dogList.get(i)[2];

        map.put(key,map.get(key)==null?1:map.get(key)+1);
    }
    for(Map.Entry<String,Integer> entry : map.entrySet()){
        String key = entry.getKey();
        String breedRank[] = new String[3];
        String getBackValues[] = key.split("_");
        breedRank[0] = getBackValues[0];
        breedRank[1] = getBackValues[1];
        breedRank[2] = String.valueOf(entry.getValue());
        System.out.println(breedRank[0]+ ", " + breedRank[1]+","+ breedRank[2]);
        dogTotal.add(breedRank);
    }
    System.out.println(dogTotal);

您需要创建一个类Dog

一旦你有了一个狗类课程,你可以这样做:

Dog d2 =  new Dog("t4639", "Akita", "First", "Marshal");
Dog d3 = new Dog( "t4638", "Akita", "First", "Tom");
Dog d4 =  new Dog("t4637", "Beagle", "First", "Eddy");
Dog d5 =new Dog("t4636", "Beagle", "Second", "Franky");

List<Dog> dogs = Arrays.asList(d2, d3, d4, d5);
看看这个代码有多干净。这是使用声明式而不是命令式

返回:

{Akita={First=2}, Beagle={Second=1, First=1}}

输出是否需要按计数排序?@Samarth不需要排序您能解释一下您要做什么吗?@OlZ您需要List dogTotal=new ArrayList;在您的代码中还是仅输出?@Samarth是的我需要dogTotal ArrayList了解如何将结果放入dogTotal ArrayList?@OlZ我已将结果放入DotTotal检查此项
Dog d2 =  new Dog("t4639", "Akita", "First", "Marshal");
Dog d3 = new Dog( "t4638", "Akita", "First", "Tom");
Dog d4 =  new Dog("t4637", "Beagle", "First", "Eddy");
Dog d5 =new Dog("t4636", "Beagle", "Second", "Franky");

List<Dog> dogs = Arrays.asList(d2, d3, d4, d5);
dogs.stream()
    .collect(Collectors.groupingBy(Dog::getBreed,
                 Collectors.groupingBy(Dog::getRank, Collectors.counting())));
{Akita={First=2}, Beagle={Second=1, First=1}}
List<String[]> dogList = new ArrayList<String[]>();

        dogList.add(new String[] { "t4639", "Akita", "First", "Marshal"});
        dogList.add(new String[] { "t4638", "Akita", "First", "Tom"});
        dogList.add(new String[] { "t4637", "Beagle", "First", "Eddy"});
        dogList.add(new String[] { "t4636", "Beagle", "Second", "Franky"});

        HashMap<String, Integer> hmap = new HashMap();

        for(String[] dog : dogList)
        {
            String type = dog[1] + ":" + dog[2];
            if(hmap.containsKey(type))
            {
                hmap.put(type, hmap.get(type) + 1);
            }
            else
            {
                hmap.put(type, 1);
            }            
        }

        for (String entry: hmap.keySet()){

            String key =entry.toString();
            String value = hmap.get(entry).toString();  
            System.out.println(key + " " + value); 
        } 
    }