Language Java
(Java 5.0 object-oriented version)
Date: | 11/19/05 |
Author: | Kvols |
URL: | n/a |
Comments: | 3 |
Info: | n/a |
Score: | (3.00 in 38 votes) |
/** * Java 5.0 version of the famous "99 bottles of beer on the wall". * Note the use of specific Java 5.0 features and the strictly correct output. * * @author kvols */ import java.util.*; class Verse { private final int count; Verse(int verse) { count= 100-verse; } public String toString() { String c= "{0,choice,0#no more bottles|1#1 bottle|1<{0} bottles} of beer"; return java.text.MessageFormat.format( c.replace("n","N")+" on the wall, "+c+".\n"+ "{0,choice,0#Go to the store and buy some more"+ "|0<Take one down and pass it around}, "+c.replace("{0","{1")+ " on the wall.\n", count, (count+99)%100); } } class Song implements Iterator<Verse> { private int verse=1; public boolean hasNext() { return verse <= 100; } public Verse next() { if(!hasNext()) throw new NoSuchElementException("End of song!"); return new Verse(verse++); } public void remove() { throw new UnsupportedOperationException("Cannot remove verses!"); } } public class Beer { public static void main(String[] args ) { Iterable<Verse> song= new Iterable<Verse>() { public Iterator<Verse> iterator() { return new Song(); } }; // All this work to utilize this feature: // "For each verse in the song..." for(Verse verse : song) { System.out.println(verse); } } }
Download Source | Write Comment
Alternative Versions
Version | Author | Date | Comments | Rate |
---|---|---|---|---|
object-oriented version | Anonymous | 04/20/05 | 33 | |
standard version | Sean Russell | 04/20/05 | 12 | |
exception oriented | Jarek Ratajski | 09/08/05 | 5 | |
bytecode-version with loader | Tilo Dickopp | 05/23/06 | 10 | |
Singing with Java Speech API | Kevin Seifert | 05/04/06 | 2 |
Download Source | Write Comment
Add Comment
Please provide a value for the fields Name,
Comment and Security Code.
This is a gravatar-friendly website.
E-mail addresses will never be shown.
Enter your e-mail address to use your gravatar.
Please don't post large portions of code here! Use the form to submit new examples or updates instead!
Comments
Charles said on 04/12/06 12:30:55
I think this program is quite good because of its simplicity and clarity.But i am not quite familiar with the way the author dealt with the string.Maybe i am a little stupid, will you take some minutes to explain it to me.Thank you.
kvols said on 12/04/06 15:47:08
Sure - and thanks for the comment!
The main idea is to make jave.text.MessageFormat format the string for the verse. MessageFormat is a quite over-looked class in Java but it's a very convinient way to format numbers, dates and strings, taking plurals into account, select between several texts depending on a number etc. The c vaiable in simply used to insert either 'no more bottles of beer', '1 bottle of beer' or 'x bottles of beer'.
The c.replace(...) is used because the verse refers to both the current and the coming number of beers, and I therefore refers to argument 0 or argument 1.
I hope this cleared up your questions. Otherwise please write to my first name dot last name at gmail dot com.
Cheers,
Povl
Ian said on 08/20/08 22:14:23
On the one hand, MessageFormat is the right tool for the job.
On the other hand, a custom Iterator giving you a new object per verse seems like overkill. And the Iterable constructor should of course take the bottle count.