user3280677
user3280677

Reputation: 75

counting the values in xml

I am Having an XML file

      <?xml version="1.0"?>
        <ticket>
  <team>A</team>
  <imp>I1</imp>
</ticket>
<ticket>
  <team>A</team>
  <imp>I2</imp>
</ticket>
<ticket>
  <team>b</team>
  <imp>I2</imp>
</ticket>
<ticket>
  <team>A</team>
  <imp>I1</imp>
</ticket>
<ticket>
  <team>B</team>
  <imp>I2</imp>
</ticket>
<ticket>
  <team>c</team>
  <imp>I1</imp>
</ticket>

out put to like :-

 Team     I1  I2   I3
  A        2   1    0
  B        1    1   0
  C        1    0   0

Here currently I3 is not there in XML. is it Possible to take I1,I2 and I3 into Hash and check if I1 is there then to get count accorind to team and display like above.

ticket.java

 package com.asn.ticket;

  public class ticket {

private String team;
private String imp;

public ticket(String team, String imp) {
    super();
    this.team = team;
    this.imp = imp;
}
public String getteam() {
    return team;
}
public void setteam(String team) {
    this.team = team;
}
public String getimp() {
    return imp;
}
public void setimp(String imp) {
    this.imp = imp;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((team == null) ? 0 : team.hashCode());
    result = prime * result + ((imp == null) ? 0 : imp.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj) 
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    ticket other = (ticket) obj;
    if (team == null) {
        if (other.team != null)
            return false;
    } else if (!team.equals(other.team)) 
        return false;
    if (imp == null) {
        if (other.imp != null)
            return false;
    } else if (!imp.equals(other.imp))
        return false;
    return true;
}
@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("ticket [team=");
    builder.append(team);
    builder.append(", imp=");
    builder.append(imp);
    builder.append("]");
    return builder.toString();
} 


 }

ticketcounts.java

       package com.asn.team;



      import com.asn.team.ticket;

        public class ticketsCount {

public static void main(String[] args) {
    List<ticket> ticketList = new ArrayList<ticket>();
    try {

      String Path = "C:\\Users";


        File fXmlFile = new File(Path+"\\tickets.xml");

       // File fXmlFile = new File(App.class.getClassLoader().getResource("C:\\Users\// \\tickets.xml").getFile());
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

                   doc.getDocumentElement().normalize();

        NodeList ticketNodeList = doc.getElementsByTagName("ticket");


        for (int temp = 0; temp < ticketNodeList.getLength(); temp++) {                
            Node varNode = ticketNodeList.item(temp);                      

            if (varNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) varNode;

                NodeList teamList = eElement.getElementsByTagName("team");
                NodeList varsionList = eElement.getElementsByTagName("imp");

                Node teamNode = teamList.item(0);
                Node impNode = varsionList.item(0);

                if(teamNode.getNodeType() == Node.ELEMENT_NODE && impNode.getNodeType() == Node.ELEMENT_NODE){
                    Element teamElement = (Element)teamNode;
                    Element impElement = (Element)impNode;
                    ticket ticket = new ticket(teamElement.getTextContent(), impElement.getTextContent());
                    ticketList.add(ticket);
                }                   
            }               
        }
    }catch (Exception e) {
        e.printStackTrace();
    }

    Map<ticket,Integer> count = new HashMap<ticket, Integer>();
    for(ticket c: ticketList)
        if(!count.containsKey(c))
            count.put(c, Collections.frequency(ticketList, c));

    List<String> imps = getimps(count);
    List<String> teams = getteams(count);

    StringBuilder heading = new StringBuilder("ticket \t| ");
    for(String s : imps){
        heading.append(s);
        heading.append("\t| ");
    }

    System.out.println(heading);
    System.out.println("---------------------------------");


    for(String m : teams){
        System.out.println(m+"\t| "+getNumOfteams(m, imps, count));
    }

}

/**
 * @param count
 * @return
 */
private static List<String> getteams(Map<ticket, Integer> count) {
    List<String> teams = new ArrayList<String>();
    for(Map.Entry<ticket, Integer> ent : count.entrySet())
        if(!teams.contains(ent.getKey().getteam()))
            teams.add(ent.getKey().getteam());
    return teams;
}


private static String getNumOfteams(String team, List<String> imps, Map<ticket, Integer> count) {
    StringBuilder builder = new StringBuilder();

        for(String v : imps){               

            for(Map.Entry<ticket, Integer> ent : count.entrySet())
                if(team.equals(ent.getKey().getteam()) && ent.getKey().getimp().equals(v)){
                    int cnt = ent.getValue();
                    builder.append((cnt==0)?" ": cnt);
                    builder.append("\t| ");
                }
        }


    return builder.toString();
}


private static List<String> getimps(Map<ticket, Integer> count) {
    List<String> imps = new ArrayList<String>();
    for(Map.Entry<ticket, Integer> ent : count.entrySet())
        if(!imps.contains(ent.getKey().getimp()))
            imps.add(ent.getKey().getimp());
    return imps;
}

}

Upvotes: 0

Views: 92

Answers (1)

JB Nizet
JB Nizet

Reputation: 691755

I haven't executed your code, but if I understand correctly, it works fine except you don't have any column for I3, because no ticket in the XML file has I3 as its imp. So you simply need to do as if there was I3 in the file:

private static List<String> getimps(Map<ticket, Integer> count) {
    List<String> imps = new ArrayList<String>();
    for(Map.Entry<ticket, Integer> ent : count.entrySet())
        if (!imps.contains(ent.getKey().getimp())) {
            imps.add(ent.getKey().getimp());
        }
    }

    // make sure I3 is listed as imp as well:
    if (!imps.contains("I3")) {
        imps.add("I3");
    }

    return imps;
}

And in the getNumOfTeams() method, you shouldn't assume that at least one ticket has the current imp. So I would rewrite it as:

private static String getNumOfteams(String team, List<String> imps, Map<ticket, Integer> count) {
    StringBuilder builder = new StringBuilder();

    for (String v : imps){               
        Integer cnt = count.get(new ticket(team, v));
        if (cnt == null) {
            cnt = 0;
        }
        builder.append(cnt + "\t");
    }
    return builder.toString();
}

Side note: you should really learn and apply naming conventions. Don't abuse abbreviations. Name your getters and setters getTeam() and setTeam() rather than getteam() and setteam(), classes start with an uppercase letter.

Upvotes: 1

Related Questions