2016-05-26 7 views
0

Ich habe eine Liste von workStatuses. Jeder workStatus hat seinen Namen und seine Uhrzeit. Ich kann workStatus.getName() tun, während ich durch jeden workStatus iteriere.Wie finde ich heraus, ob eine Arraylist ein Element enthält und die Ergebnisanzahl zu HashMap in Java addiert?

for (workStatus ws: workStatuses) { 
    String name = ws.getName(); 
} 

Weiter habe ich eine Liste von Namen Namensliste genannt.

List<String> nameList = new ArrayList<String>(); 
nameList.add("Completed"); 
nameList.add("Failed"); 

Jetzt bin ich mit HashMap Anzahl von workStatuses has.So jeden Namen zu zählen, die ich zu

  1. Iterate durch workStatuses haben.
  2. Suchen Sie für jeden workStatus den Namen.
  3. Überprüfen Sie, ob dieser Name in meiner NameList vorhanden ist.
  4. Wenn ja, dann erhöhen Sie die Nummer des Workstatus für diesen Namen und setzen Sie diese Zahl auf HashMap.

Was ich getan habe:

Integer numberOfWorkStatus =0; 
Map<String,Integer> hm = new HashMap<String,Integer>(); 
for(WorkStatus ws: workStatuses) { 
       if (ws.getName()!=null && nameList.contains(ws.getName())) { 
        numberOfWorkStatus++; 
        hm.put(ws.getName(), numberOfWorkStatus); 
       } 
} 
return hm; 

Kann mir jemand vorschlagen, wenn ich es richtig mache?

+0

Ihr Code scheint nicht zu „count Anzahl von workStatuses jeder Name hat“, zum Beispiel 'totalCount' für einen beliebigen Namen geteilt zu sein scheint, oder habe ich das falsch verstanden? –

+0

Loris wird nicht geteilt. Jeder Name kann eine unterschiedliche Anzahl von workStatus haben. Das ist was ich will. Ich habe den Variablennamen geändert, um ihn jetzt informativer zu machen. Macht es jetzt Sinn? – Rthp

+1

Ich sage nur, dass Ihr Code diese Anzahl für jeden Namen teilt, also ist es nicht korrekt. Werfen Sie einen Blick auf die vorgeschlagenen Antworten. –

Antwort

3

können Sie Stream-API verwenden, und wenn ich mich recht etwas tun, wie diese:

// List<WorkStatus> workStatuses = ... 
workStatuses.stream().collect(
    Collectors.groupingBy(WorkStatus::getName, Collectors.counting())); 

als Ergebnis Sie Map<String, Long>

+0

Ich denke, Sie müssen _filter_ "ws" -Objekt mit Null-Namen vor dem Sammeln – erkfel

+0

Um die Anforderungen des OP zu erfüllen, müssen Sie für WorkStatuses filtern, deren Namen in Namelist existieren. –

0

Sie können dies ändern:

for (String str:nameList){ 
    if (str.contains(ws.getName())) { 
    totalCount++; 
    hm.put(ws.getName(), totalCount); 
} 
} 

Sie nicht aus einer Liste direkt für einen String überprüfen und die, die Sie in HM setzen solltews sein.

+1

geändert in ws, es war ein Tippfehler. Ich werde deinen Vorschlag durchgehen und es versuchen. Wird das Ergebnis aktualisieren. Vielen Dank. – Rthp

1

haben Sie können tun, dass diese Art und Weise:

for(Stirng name :nameList) 
    hm.put(name, 0); 

for(WorkStatus ws: workStatuses) { 
    if(hm.get(ws.getName() != null) 
     hm.put(ws.getName(), hm.get(ws.getName()) + 1); 

} 

hm will enthält die Anzahl der Namen, die in den workStauses vorhanden sind.

+0

Gute Antwort außer dem zweiten Teil, wo Sie sagen, dass Sie es ohne Bedingung tun können, ich denke nicht, dass das eine Option ist, denn wenn Sie einen workStatus erhalten, dessen Name nicht in NameList ist, erhalten Sie eine NullPointerException. –

+0

ja du hast recht :) nullzeiger ist überall und wir sollten uns darum kümmern :)), danke – Sir1

0
Map<String, Integer> hm = new HashMap<>(); 
for (WorkStatus ws : workStatuses) { 
    if (ws.getName() != null && nameList.contains(ws.getName())) { 
     hm.putIfAbsent(ws.getName(), 0); 
     hm.put(ws.getName(), hm.get(ws.getName()) + 1); 
    } 
}