View Single Post
  #2 (permalink)  
Old 12-06-2007, 02:42 AM
hardwired hardwired is offline
Senior Member
 
Join Date: Jul 2007
Posts: 1,222
hardwired is on a distinguished road
Code:
import java.io.*; import java.util.*; public class Gramata3 { public static void main(String[] args) { String[][] books = { // book author year { "Head First Java", "Bates and Sierra", "2003" }, { "Thinking In Java", "Bruce Eckel", "2002" }, { "Learning Java", "Niemeyer and Knudsen", "2000" }, { "Developing Java Sortware", "Winder and Roberts", "2000" } }; File file = new File("gramata3.txt"); try { PrintWriter out = new PrintWriter( new FileWriter(file)); for(int j = 0; j < books.length; j++) { out.println(books[j][2] + " " + books[j][0] + " by " + books[j][1]); } out.close(); } catch(IOException e) { System.out.println("write error: " + e.getMessage()); } BufferedReader reader = new BufferedReader( new InputStreamReader(System.in)); try { System.out.println("Enter a book, see book list " + "or quit? 'e'/'s'/'q'"); String choice = reader.readLine(); while(!choice.equalsIgnoreCase("q")) { if(choice.equals("e")) { System.out.print("Enter name of the book: "); String book = reader.readLine(); System.out.println("enter author"); String author = reader.readLine(); System.out.println("enter year"); String year = reader.readLine(); PrintWriter out = new PrintWriter( new FileWriter(file, true)); out.println(year + " " + book + " by " + author); out.close(); } else if(choice.equals("s")) { System.out.println("sort books by title, author " + "or date? 't'/'a'/'d'"); choice = reader.readLine().toLowerCase(); int index = choice.equals("t") ? 1 : choice.equals("a") ? 2 : 0; showBooks(file, index); } System.out.println("Enter a book see, book list " + "or quit? 'e'/'s'/'q'"); choice = reader.readLine(); } reader.close(); } catch(IOException e) { System.out.println("main I/O error: " + e.getMessage()); } } private static void showBooks(File file, int index) { List<String> list = new ArrayList<String>(); try { BufferedReader in = new BufferedReader( new FileReader(file)); String line; while((line = in.readLine()) != null) { list.add(line); } in.close(); } catch(IOException e) { System.out.println("showBooks I/O error: " + e.getMessage()); } sort(list, index); } private static void sort(List<String> list, int index) { // Parse the lines into the title, author and date data. String[][] data = new String[list.size()][]; for(int j = 0; j < list.size(); j++) { String book = (String)list.get(j); data[j] = getBookData(book); } // Sort the books. for(int j = 0; j < data.length; j++) { String min = data[j][index]; int minIndex = j; for(int k = j+1; k < data.length; k++) { int compare = 0; switch(index) { case 0: // year Integer n = Integer.valueOf(min); compare = Integer.valueOf(data[k][index]).compareTo(n); break; case 1: // title String s = String.valueOf(min); compare = data[k][index].compareTo(s); break; case 2: // author String name = getComparableName(data[k][index]); s = getComparableName(min); compare = name.compareTo(s); } if(compare < 0) { min = data[k][index]; minIndex = k; } } if(minIndex != j) { // Found lower sort value, swap book elements. String[] temp = data[j]; data[j] = data[minIndex]; data[minIndex] = temp; } } // Print the sorted array. for(int j = 0; j < data.length; j++) { String year = data[j][0]; String title = data[j][1]; String author = data[j][2]; System.out.println(year + " " + title + " by " + author); } System.out.println("------------------"); } private static String[] getBookData(String book) { String[] data = new String[3]; int start = book.indexOf(" "); data[0] = book.substring(0, start); // year int by = book.indexOf(" by ", start+1); data[1] = book.substring(start, by); // title data[2] = book.substring(by + 4); // author return data; } private static String getComparableName(String s) { boolean hasAnd = s.indexOf(" and ") != -1; int last = s.lastIndexOf(" "); if(!hasAnd && last != -1) { // Put last name first for accurate sorting. s = s.substring(last+1) + " " + s.substring(0, last); } return s; } }
Reply With Quote