Reputation: 23
I am trying to run this code and ArrayList data = handler.getnames(); is showing an error variable data is alredy defined in method main(String[]). I am guessing it wants me to combine it with ArrayList data = handler.getsetnums();. But how to i do it? or is there another way?
Ones the code works, and should be able to run it and get an output, now when i only have one Array working the code does what it needs to do.
expected outcome
<set-num>00-1</set-num>
<name>WEETABIX CASTLE</name>
Thank you.
---MAIN.java---
package assign6;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
*
* @author assign
*/
public class Assign6 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.print("Welcome to Benjamin Bolyard's Lego Sorter");
try {
XMLReader reader = XMLReaderFactory.createXMLReader();
MyHandler handler = new MyHandler();
reader.setContentHandler(handler);
reader.setErrorHandler(handler);
InputSource inputSource = new InputSource("legoSets.xml");
reader.parse(inputSource);
ArrayList<String> data = handler.getsetnums();
System.out.println("setnum List");
System.out.println("----------");
for (int i = 0; i < data.size(); i++) {
String setnum = data.get(i);
setnum = setnum.toUpperCase();
System.out.println((i + 1) + ": " + setnum);
}
ArrayList<String> data = handler.getnames();
System.out.println("name List");
System.out.println("----------");
for (int i = 0; i < data.size(); i++) {
String name = data.get(i);
name = name.toUpperCase();
System.out.println((i + 1) + ": " + name);
}
} catch (SAXException ex) {
Logger.getLogger(BolyardAssign6.class.getName())
.log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(BolyardAssign6.class.getName())
.log(Level.SEVERE, null, ex);
}
}
}
--HANDLER.java---
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package bolyardassign6;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* @author bolya
*/
public class MyHandler extends DefaultHandler {
private boolean inlegosets;
private boolean inname;
private boolean insetnum;
private String nameBuffer;
private String setnumBuffer;
private ArrayList<String> setnums, names;
public ArrayList<String> getsetnums() {
return setnums;
}
public ArrayList<String> getnames() {
return names;
}
@Override
public void startDocument() throws SAXException {
// System.out.println("Start Document")
insetnum = false;
inname = false;
inlegosets = false;
nameBuffer = "";
names = new ArrayList<>();
}
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
if (localName.equals("lego-sets")) {
inlegosets = true;
} else if (inlegosets && localName.equals("setnum")) {
// System.out.println("Start element : " + localName);
insetnum = true;
setnumBuffer = "";
} else if (inlegosets && localName.equals("name")) {
// System.out.println("Start element : " + localName);
inname = true;
nameBuffer = "";
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String data = new String(ch, start, length);
if (inlegosets && inname) {
// System.out.println("Characters : " + data);
nameBuffer = nameBuffer + data;
} else if (inlegosets && insetnum) {
// System.out.println("Characters : " + data);
setnumBuffer = setnumBuffer + data;
}
}
@Override
public void endElement(String uri, String localName,
String qName) throws SAXException {
if (localName.equals("inlegosets")) {
inlegosets = false;
} else if (inlegosets && localName.equals("setnum")) {
// System.out.println("Title: " + titleBuffer);
// System.out.println("End element : " + localName);
// System.out.println();
setnums.add(setnumBuffer);
insetnum = false;
} else if (inlegosets && localName.equals("name")) {
// System.out.println("Title: " + titleBuffer);
// System.out.println("End element : " + localName);
// System.out.println();
names.add(nameBuffer);
inname = false;
}
}
@Override
public void endDocument() throws SAXException {
// System.out.println("End Document");
}
@Override
public void error(SAXParseException e) throws SAXException {
System.out.println("ERROR: Line number " + e.getLineNumber());
System.out.println("ERROR: " + e.getMessage());
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("FATAL ERROR: Line number " + e.getLineNumber());
System.out.println("FATAL ERROR: " + e.getMessage());
}
}
---legoset.xml---
<lego-sets>
<set>
<set-num>00-1</set-num>
<name>WEETABIX CASTLE</name>
<year>1970</year>
<num-parts>471</num-parts>
</set>
<set>
<set-num>0011-2</set-num>
<name>TOWN MINI-FIGURES</name>
<year>1978</year>
<num-parts>12</num-parts>
</set>
<set>
<set-num>0011-3</set-num>
<name>CASTLE 2 FOR 1 BONUS OFFER</name>
<year>1987</year>
<num-parts>2</num-parts>
</set>
<set>
<set-num>0012-1</set-num>
<name>SPACE MINI-FIGURES</name>
<year>1979</year>
<num-parts>12</num-parts>
</set>
</lego-sets>
Upvotes: 0
Views: 89
Reputation: 83557
I am trying to run this code and ArrayList data = handler.getnames(); is showing an error variable data is alredy defined in method main(String[]). I am guessing it wants me to combine it with ArrayList data = handler.getsetnums();. But how to i do it? or is there another way?
You have the right idea. The error is caused because you have two variable declarations withe same name:
ArrayList data = handler.getnames()
and
ArrayList data = handler.getsetnums();
Java doesn't allow this. However, you don't necessarily want to "combine them together" because these are two separate lists that seem to represent two different things.
I suggest changing the names of both variables to something more meaningful than data
. For example:
ArrayList names = handler.getnames()
and
ArrayList setnums = handler.getsetnums();
Presumably, names
and setnums
represent something meaningful for what you are doing here.
Upvotes: 0
Reputation: 432
You have defined two variables with the name data
. To fix this, change the name of one of them. Alternatively you can remove the declaration and just have the following on the second arraylist: data = handler.getnames();
Upvotes: 1