繁体   English   中英

在数组列表中组合Java对象

[英]Combining java objects in an arraylist

所以我有一个LeaderBoard对象的临时数组列表(如下所示),我想将所有具有相同游戏名称的gamertag组合在一起,形成一个新的arraylist。 我将如何去做呢?

LeaderBoard [win=0, lose=1, gameName=QUFI, gamerTag=Ithroeann, platform=IO], 
LeaderBoard [win=1, lose=0, gameName=QUFI, gamerTag=Ithroeann, platform=IO], 
LeaderBoard [win=1, lose=0, gameName=CODE, gamerTag=Cirronith, platform=PS], 
LeaderBoard [win=1, lose=0, gameName=CODE, gamerTag=Cirronith, platform=PS], 
LeaderBoard [win=1, lose=0, gameName=QUFI, gamerTag=Deathstar, platform=IO], 
LeaderBoard [win=1, lose=0, gameName=QUFI, gamerTag=Deathstar, platform=IO], 
LeaderBoard [win=0, lose=1, gameName=QUFI, gamerTag=Deathstar, platform=IO], 
LeaderBoard [win=0, lose=1, gameName=CODE, gamerTag=Mazzzap, platform=AN], 
LeaderBoard [win=0, lose=1, gameName=NUPI, gamerTag=Mazzzap, platform=AN], 
LeaderBoard [win=1, lose=0, gameName=QUFI, gamerTag=Mazzzap, platform=AN], 
LeaderBoard [win=1, lose=0, gameName=QUFI, gamerTag=Redstripe, platform=PC], 
LeaderBoard [win=0, lose=1, gameName=CODE, gamerTag=Redstripe, platform=PC], 
LeaderBoard [win=1, lose=0, gameName=NUPI, gamerTag=Redstripe, platform=PC], 
LeaderBoard [win=1, lose=0, gameName=CODE, gamerTag=Redstripe, platform=PC], 
LeaderBoard [win=1, lose=0, gameName=QUFI, gamerTag=Crayonbreath, platform=PS], 
LeaderBoard [win=1, lose=0, gameName=CODE, gamerTag=Quinesia, platform=XB], 
LeaderBoard [win=1, lose=0, gameName=NUPI, gamerTag=Quinesia, platform=XB], 
LeaderBoard [win=0, lose=1, gameName=QUFI, gamerTag=VolcanoBrawler, platform=PC], 
LeaderBoard [win=0, lose=1, gameName=NUPI, gamerTag=VolcanoBrawler, platform=PC], 
LeaderBoard [win=0, lose=1, gameName=NUPI, gamerTag=VolcanoBrawler, platform=PC], 
LeaderBoard [win=0, lose=1, gameName=CODE, gamerTag=VolcanoBrawler, platform=PC], 
LeaderBoard [win=0, lose=1, gameName=QUFI, gamerTag=CastleRock, platform=XB], 
LeaderBoard [win=1, lose=0, gameName=NUPI, gamerTag=TorpedoBear, platform=PC], 
LeaderBoard [win=1, lose=0, gameName=NUPI, gamerTag=GreenPanda, platform=AN], 
LeaderBoard [win=0, lose=1, gameName=NUPI, gamerTag=GreenPanda, platform=AN]]

变成:

LeaderBoard [win=1, lose=1, gameName=QUFI, gamerTag=Ithroeann, platform=IO]
LeaderBoard [win=2, lose=0, gameName=CODE, gamerTag=Cirronith, platform=PS]

等等...

我不知道该怎么做。

我可以从一些伪代码开始吗?

// create an empty output array list
// for each element in the input array list
//     attempt to add it to the output
//     if the output already contains an element for this gamer tag, game name, etc
//         update that element, adding to the win/loss count
//     else
//         add a new record with this win/loss count

EDIT1:好的,稍微扩展一下:

ArrayList<LeaderBoard> output = new ArrayList<LeaderBoard>();
:outer
for (LeaderBoard i : input) {
    for (LeaderBoard o : output) {
        if (i.gameName.equals(o.gameName)
            && i.gamerTag.equals(o.gamerTag)
            && i.platform.equals(o.platform)) {
            o.win += i.win;
            o.lose += i.lose;
            break outer;
        }
    }
    output.add(i);
}
return output;

EDIT2:如果您不想使用带标签的中断:

ArrayList<LeaderBoard> output = new ArrayList<LeaderBoard>();
for (LeaderBoard i : input) {
    boolean shouldAdd = true;
    for (LeaderBoard o : output) {
        if (i.gameName.equals(o.gameName)
            && i.gamerTag.equals(o.gamerTag)
            && i.platform.equals(o.platform)) {
            o.win += i.win;
            o.lose += i.lose;
            shouldAdd = false;
            break;
        }
    }
    if (shouldAdd) {
        output.add(i);
    }
}
return output;

您可以按照Luke的建议手动进行操作(很好的答案,+ 1)。

或者,您可以创建一个LeaderBoard对象的HashMap,其键为gamerTag,其值为当前的LeaderBoard对象。

普通的HashMaps每个键只允许一个值,这将使它们非常快速地查找并且易于更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM