Reputation: 35
The method I am working on is readDataFromFile()
. It reads a file that has data separated with Tabs
such as:
Bird Golden Eagle Eddie
Mammal Tiger Tommy
Mammal Lion Leo
Bird Parrot Polly
Reptile Cobra Colin
This is what I have been asked to do however I may not fully understand how to create this, any help would be much appreciated.
Question I have been given:
Spaces at the beginning or end of the line should be ignored. You should extract the three substrings and then create and add an Animal object to the zoo. You should ignore the first substring ("Bird" in the above example) as it is not required for this part of this project. Also note that, similar to the code you should have commented out, the addAnimal() method will require a third parameter "this" representing the owner of the collection. On successful completion of this step you will have a "basic" working version of readDataFromFile()
Zoo class:
public class MyZoo
{
private String zooId;
private int nextAnimalIdNumber;
private TreeMap<String, Animal> animals;
private Animal animal;
public MyZoo(String zooId)
{
this.zooId = zooId.trim().substring(0,3).toUpperCase();
nextAnimalIdNumber = 0;
animals = new TreeMap<String, Animal>();
}
public String allocateId()
{
nextAnimalIdNumber++;
String s = Integer.toString(nextAnimalIdNumber);
while ( s.length()<6 )
s = "0" + s;
return zooId + "_" + s;
}
public void addAnimal(Animal animal)
{
animals.put(animal.getName(), animal);
this.animal = animal;
}
public void readDataFromFile() throws FileNotFoundException
{
int noOfAnimalsRead = 0;
String fileName = null;
JFrame mainWindow = new JFrame();
FileDialog fileDialogBox = new FileDialog(mainWindow, "Open", FileDialog.LOAD);
fileDialogBox.setDirectory(".");
fileDialogBox.setVisible(true);
fileName = fileDialogBox.getFile();
String directoryPath = fileDialogBox.getDirectory();
File dataFile = new File (fileName);
Scanner scanner = new Scanner(dataFile);
//System.out.println("The selected file is " + fileName);
scanner.next();
while(scanner.hasNext())
{
String name = scanner.nextLine();
System.out.println("Animal: " + name);
}
}
Animal Class:
public class Animal
{
private String id;
private String species;
private String name;
public Animal(String species, String name, MyZoo owner)
{
id = owner.allocateId();
this.species = species;
this.name = name;
}
public String getId()
{
return id;
}
public String getName()
{
return name;
}
public String getSpecies()
{
return species;
}
public String toString()
{
return id + " " + name + ": a " + species;
}
}
Upvotes: 0
Views: 84
Reputation: 14572
You can simply use Scanner.next
to read your file (here I used a String
that match what you could find in the file)
Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern
String data = "Bird\tGolden Eagle \t Eddie\nMammal \t Tiger Tommy";
Scanner scanner = new Scanner(data);
while (scanner.hasNext()) {
System.out.println("Animal: " + scanner.next());
}
scanner.close();
Output :
Animal: Bird
Animal: Golden
Animal: Eagle
Animal: Eddie
Animal: Mammal
Animal: Tiger
Animal: Tommy
This will used the delimiter from Scanner
as defined in the class
A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace
And we can see the default value using
System.out.println(scanner.delimiter());
\p{javaWhitespace}+
Upvotes: 0
Reputation: 24691
while( scanner.hasNext() ) {
String fileLine = scanner.nextLine()
String[] animalNames = fileLine.split("\t")
...
}
You already are using a scanner in your code, so I'm assuming you know in general how the scanner works. The above code first reads in the next line of input, as a String. So, for example, after that first bit,
fileLine := "Bird Golden Eagle Eddie"
Then, I declare an Array of strings called animalNames
, and set it equal to fileLine.split("\t")
. This is a method you can call on a String - what it does is it returns an array of substrings, delimited by whatever you give it. In this case, I give the function "\t"
, which is the character that represents a tab. So, after this line,
animalNames := {"Bird", "Golden Eagle", "Eddie"}
Since you now have an array of strings, you can do the rest of the assignment by picking items out of it - for example,
animalNames[0] := "Bird"
animalNames[1] := "Golden Eagle"
animalNames[2] := "Eddie"
Upvotes: 2