LinkedListThis implies that we are declaring an Array called AdjLists. No matter what, the Graph at the end is just an Array!!! This Array called AdjLists will hold elements of the type LinkedList which are in turn containers of type 'Edge'. Whatever Edge means... So basically, we are implementing a 3 level structure, at the end the edge objects are elements that are stored in Linked Lists, which are themselves stored in an Array! How beautiful!!!!!!!!!!!![ ] AdjLists = new LinkedList [numberOfVertices];
Thursday, November 29, 2007
Declaring an Edge Adjacency List Graph
The 3 types of Graph representations are:
1. Edge List
2. Adjacency Edge List
3. Edge Matrix
The heart of the simplest representation of Edge List is the following:
Monday, November 26, 2007
MaximallyBalanced or Complete Binary Tree
// Queue version -- only version totally working so far! public boolean isMaximallyBalanced (TreeNode x){ boolean scanningNulls = false; Dequeq = new LinkedList (); q.addFirst(x); while (q.size() != 0) { TreeNode n = q.remove(); if (scanningNulls) { if (n != null) return false; } else { if (n == null) { scanningNulls = true; } else { q.add(n.myLeft); q.add(n.myRight); } } } return true; } // Adopted from: www.boyet.com/Articles/CheckingForHeap.html
Wednesday, November 21, 2007
Calculating the Height of a Tree
//Increase the height only when the recursive call generates a new Iterator!!! private static int height (T x) { if (x.myChildren.isEmpty ( )) { return 1; } else { int bestSoFar = 0; Iteratoriter = x.myChildren.iterator ( ); while (iter.hasNext ( )) { T child = iter.next ( ); bestSoFar = Math.max (height(child) + 1, bestSoFar); } return bestSoFar; } }
Monday, November 19, 2007
Adding to a Circular Doubly Linked List
public void add (Object to_Add) { if (isEmpty ( )) { myHead = new DListNode (to_Add); } else { // Insert to_Add between myHead and myHead.myPrev. DListNode newNode = new DListNode (to_Add, myHead.myPrev, myHead); // Link the new node into the list. myHead.myPrev.myNext = newNode; // This is the circular link stuff. myHead.myPrev = newNode; } mySize++; }
Sunday, November 18, 2007
3 ways to REVERSE a list (singly linked)
There are 50 ways to leave your lover (P.Simon) but fundamentally 3 ways to reverse a list 1. Recursively Non-Destructive 2. Recursively Destructive 3. Iteratively Recursively Non-Destructive: public ListNode reverse (ListNode list) { ListNode sofar = new EmptyListNode(); return reverseHelper (this, sofar); } private static ListNode reverseHelper (ListNode list1, ListNode sofar) { if (list1.isEmpty()) { return sofar; } else { return reverseHelper (list1.rest() , new NonemptyListNode (list1.first(), sofar) ); } } Recursively Destructive: public void reverse2 () { myHead = reverse2Helper (myHead, null); } public static ListNode reverse2Helper (ListNode L, ListNode soFar){ if (L == null){ return soFar; } else { ListNode temp = L.myRest; L.myRest = soFar; return reverse2Helper (temp, L) ; } } Iteratively: public void reverse3 () { myHead = reverse3Helper (myHead); } public static ListNode reverse3Helper (ListNode head){ ListNode p, soFar; for (p = head, soFar = null; p != null;){ ListNode temp = p.myRest; p.myRest = soFar; soFar = p; p = temp; } return soFar; }
Reversing a List Iteratively!
public void reverse3 () { myHead = reverse3Helper (myHead); } public static ListNode reverse3Helper (ListNode head){ ListNode p, soFar; for (p = head, soFar = null; p != null;){ ListNode temp = p.myRest; p.myRest = soFar; soFar = p; p = temp; } return soFar; }
Saturday, November 17, 2007
Doubling a Linked List
//couldn't find a better way to do this... public void double2 ( ) { /* Invariant is L with 2 first ones and rest*/ ListNode q, w; w = q = new ListNode (null); for (ListNode p = myHead; p != null; p = p.myRest) { q.myRest = new ListNode(p.myFirst, p); q = q.myRest.myRest; } myHead = w.myRest; /*ListNode p = myHead; ListNode p1 = myHead.myRest; ListNode p2 = myHead.myRest.myRest; myHead = new ListNode (p.myFirst, p); myHead.myRest.myRest = new ListNode (p1.myFirst, p1); myHead.myRest.myRest.myRest.myRest = new ListNode (p2.myFirst, p2); */ } public void double3 ( ) { ListNode w; w = new ListNode (myHead.myFirst); for (ListNode p = myHead; p != null; p = p.myRest) { w.myRest= new ListNode(p.myFirst, p); w = w.myRest.myRest; System.out.println(this.toString()); } myHead = new ListNode (myHead.myFirst, myHead); }
Friday, November 9, 2007
Access Modifiers: public, private, proctecd, package protected(default)
Public : declarations represent specifications – what clients of a package are supposed to rely on.
Package Private (default): declarations are part of the implementation of a class that must be known to other classes that assist in the implementation.
Protected: declarations are part of the implementation that subtypes may need, but that clients of the subtypes generally won’t.
Private: declarations are part of the implementation of a class that only that class needs.
***********************************************************************
Import: Does not grant any special access; it only allows abbreviation.
Thursday, November 8, 2007
End of HFJ
Announcing the end of going through HFJ. Admittedly, only a first pass...
But finally finished back back to back...well maybe except for code kitchens on
the beat program and some of the appendices...But did finish all the chapters,
didn't I?
It's a great book and one that really make stuff look easy. As they say, the best
always make it look easy! And this is kind of, one of the best example of that saying!
Took me 5 weeks to go through it all. But it was a great experience. I'll miss,
reading that book, it seems to me!
In any case, on to more stuff then....
Wednesday, November 7, 2007
Format Specifiers
Format Specifiers: % [argument number] [flags] [width] [.precision] type %: says, ‘insert arument here’ and format it using these instructions. flags: these are for special formatting options like inserting commas, or Putting negative numbers in parentheses, or to make the numbers Left justified width: This defines the Minimum number of characters that will be sued. That’s minimum not TOTAL. If the number is longer than the width,it’ll still be used in full, but if it’s less than the width, it’ll be padded with zeroes. Most of the time this does not need to be specified. .precision: It defines the precision. In other words, it sets the number of decimal places. type: Type is mandatory and will usually be ‘d’ for a decimal integer or ‘f’ for a floating point number. E.g. : format(“%,3.1f”, 91.0000000); -> 91.0 complete example code: public class FormatTest { static String x = ""; static double y = 91.000000; public static void main(String[] args) { x = String.format("%,3.1f", y); System.out.println(x); } } // produces: 42.0 // Adopted from HFJ
Tuesday, November 6, 2007
Generic class definitions and one implementation
Generic class definitions and one implementation Type parameterization goes in the horizontal direction while abstraction takes care of the vertical direction. The idea is the same, reusability and other OOP goodness. “The Class, the central notion in Object Technology, can be viewed as the product of the corporate merger between the module and type concepts.” A generic class declared as C[G] is, rather than a type, a type pattern covering an infinite set of possible types; you can obtain any one of these by providing an actual generic parameter – itself a type - corresponding to G. Java allows the use of wildcards to specify bounds on what type of parameters a given generic object may have. E.g. List indicates a list which has an unknown object type. List is pronounced as List of Unknowns. Void printCollection (Collection c) { For (Object e : c) System.out.println(e); } // will work for any collection of objects. //But if the formal argument is Collection
Thursday, November 1, 2007
doubling a List
//couldn't find a better way to do this... public void double2 ( ) { /* Invariant is L with 2 first ones and rest*/ ListNode q, w; w = q = new ListNode (null); for (ListNode p = myHead; p != null; p = p.myRest) { q.myRest = new ListNode(p.myFirst, p); q = q.myRest.myRest; } myHead = w.myRest; /*ListNode p = myHead; ListNode p1 = myHead.myRest; ListNode p2 = myHead.myRest.myRest; myHead = new ListNode (p.myFirst, p); myHead.myRest.myRest = new ListNode (p1.myFirst, p1); myHead.myRest.myRest.myRest.myRest = new ListNode (p2.myFirst, p2); */ } public void double3 ( ) { ListNode w; w = new ListNode (myHead.myFirst); for (ListNode p = myHead; p != null; p = p.myRest) { w.myRest= new ListNode(p.myFirst, p); w = w.myRest.myRest; System.out.println(this.toString()); } myHead = new ListNode (myHead.myFirst, myHead); }
Don't Forget Your Scheme!
Well, wasted half a day yesterday by forgetting my Scheme. Finally, A&S came to the rescue, somehow remembered after wasting a lot of time, that 'append!' was one of the examples in that book and the same stuff basically can be done in Java too.. Here is the Scheme version: (define (append! x y) (set-cdr! (last-pair x) y) x) Here last-pair is a procedure that returns the last pair in its argument: (define (last-pair x) (if (null? (cdr x)) x (last-pair (cdr x)))) From there the Java version for append! or what we call, descructively appending a list to another one while not instantiating another one is easy. Though we have to instantiate a new ListNode... ListNode LastP = lastPair(list1); LastP.setNext(list2); //setNext is set-cdr! return list1; Here's the helper for Java... public static LNode lastPair(ListNode y){ if (y.next().isEmpty()){ return y; } else return lastPair(y.next()); } Another instersting one is the Reverse method: Scheme Version: (define (reverse L) (reverse-helper L '( )) ) (define (reverse-helper L so-far) (if (null? L) so-far (reverse-helper (cdr L) (cons (car L) so-far)) ) ) Java version works the sameway if we are writing the recursive one: return reverseHelper (list1.next() , new LNode (list1.data(), sofar) );
Wednesday, October 31, 2007
Deconstructing a Scheme recursive function and implementing it as a java method..
Deconstructing a Scheme recursive function and implementing it as a java method.. In scheme, to add an element to the end of the list we have the following procedure: (define (add-to-end-of-list list a) (if (null? list) '(a) (cons (car list) (add-to-end-of-list (cdr list) a)) ) ) This is recursive. And answer returns after it hits base case and everybody is happy! Ecept for the stack I guess. Amazing thing is, we can pretty much do the same in Java! public Lnodeadd (Object a) { return LnodeAddHelper (this, a); } private static LnodeAddHelper (Lnode L, Object a) { if (L.Empty()) { return new Lnode (a); } else { return new Lnode(L.first(), LnodeAddHelper (L.rest(), a)); //the above line is mind blowing or what??? } } Here Lnode is the singly linked List. first() is car, rest() is cdr and the Lnode constructor is the cons.
Sunday, October 28, 2007
Anasi Boys
Finished reading 'Anasi Boys' By Neil Gaiman. Good book, though I kinda felt
that towards the end it could've been made shorter, it just dragged on for a
bit towards the end...
A gripping book nonetheless. Had to read it through all night last night to finish
it, couldn't put it down! :(
Gives you some new ways at looking at things...it does, though!
Here's the Amazon link...
http://www.amazon.com/Anansi-Boys-Novel-Neil-Gaiman/dp/006051518X
Iterator for Collection and Nested Class
When we are creating an Iterator for a class, we are actually calling
on the nested/inner class maybe. If the iterator is inside the main class,
it makes perfect sense to put the iterator there with its hasNext(), hasElement(),
initIterator(), and other methods...
So we create an iterator like this and looks like a method call but it's a call
on the nested class...
Iterator iter = mySomeKindOfList.myListIterator ( );
Tuesday, October 23, 2007
The Uninvited!
Finished reading 'The Univited'..also known as 'The Banquet Bug': http://www.amazon.com/BANQUET-BUG-Geling-Yan/dp/1401366651 Good book. Read it in 2 days. A very fast read and very interesting idea. You feel for the 'stupid' hero. It depicts the reality of China and not the all embracing positive productive image that is projected by the powers that be! Though I found the backcover story line to not follow the actual story. Don't know if the book went through severe editorial stuff since it's first publication or something or just that the back cover story line was written by some guy who only heard about the book and actually didn't get to read it! That's a posibility too! In any case, quite a book to enjoy. Geling Yan did a good job. Though in some places there were heavy signs of editing that made for some impression of disjointedness. Don't know if this was a literary mechanism or problem. Who can tell. At least, I liked what I read. You get to really like the characters and the writer makes you care for them. The books dishes the journalist for some good measure. But given the state of the Media in the world, who can blame her? What her hero does, is I guess is done by many a journalist where they have the trappings of Journalism and in the mean time they just copy and paste somebody's propaganda....
Inheritence and PolyMorphIsm
Don't believe in any 'ISM' but making an exception here, perhaps the SUN guys will change the word some time later as all 'ISM' brings bad news in the end. Maybe, PolyMorphISM is no exception to this 'invariant'! For the following discussion, we have to classes, Super and Sub which extends the Super class, both class defines the same non-static method (same signature, return type) within itself, we call this method methodx Super A = new Sub (); A.methodx(); Calls the methodx of the Sub class, _not_ the Super class. This is dynamic binding at work. Most important thing to remember is that Dynamic Type is the KING! Doesn’t matter what the static Type is! The method to call at run time WILL BE based on the dynamic type. Thus in the above, when we do the method call, the ‘methodx’ of the Sub class will be called even though static type is Super. But we don’t care about static type with dynamic binding. Sub B = new Super (); This results in compile time error, since we can not go from low to high in terms of assignment. The way I put it is that the servant can not wear the Master’s shoes! (At least according to Java Compiler). If the Super class is the Master and the Sub class is the slave, then Sub class can not own property titles of the Master. Here we extend the analogy this way....the Super class is the Master and objects of that class are the property of the Master. The static type of the Parent class is actually the title deeds on the property. So, here we are thinking that, in terms of references, or arrows, those are actually property titles and the actual property is the actual instantiated objects, while the Master is actually the Class itself. Ok… maybe convoluted. But stay with me, I’m making this up as we go along! :) In any case, in terms of the analogy, Static type Sub is the slave and all variables of its type (like B) can only be of deeds to its own property (meager though they maybe or not…after all can slaves really own ANYTHING? They can not, only they seem to do so some times, which is an illusion. This hypothesis will be verified and testified by Java compiler in a little while as we will see!), i.e. instantiated objects of its own type (Sub class type). If it tries otherwise, Java will stop it. Thus we will get a compile error. Super C = new Super (); ((Sub) C).methodx(); This results in a run time error. Here we have the Master and all, but we try to cast the master as a slave. This passes through compiler, as they are all beings of the same world. However, when running it will found that the dynamic type is also Super so, the compiler doesn’t know what to do in such a situation. Going back to the Master slave analogy, we have a proper Master here with both static and dynamic type as Master, thus when we ask it to do slave work, it says, “I don’t do no slave work!” (you can see how the Master picks up some slave idioms in the in the mean time…) However if the casting was like this… Super D= new Sub ( ); ((Sub) D).methodx ( ); The everything is OK, as then the Master is cast into slave and it was a slave all along! The dynamic type was Sub! We don’t even have to cast…as D was a slave by it’s dynamic type all along, and we know that dynamic type RULES!!! Sub E = new Sub (); ((Super) E).methodx(); Here still, same stuff, just have to remember that dynamic type is what matters. We can cast the slave E to be the of the Master race but when he goes to work, we see that all he knows is slave work and none of the Master’s work. Thus, the methodx from the Sub class gets called. Since even though we case E, we just change the Static type by the cast, we can not change the Dynamic type and the dynamic type is still pointing at a Sub object… So the take away point is: 1. Dynamic type is all that matters on method call, I mean non-static methods. 2. Sub class static type var can NOT point to Super objects. 3. Super static type var CAN point to Sub objects. In terms of Casting: 1. Casting Super var to Sub is NOT OK, where the dynamic type was Super 2. Casting to Super of Sub var is OK, but doesn’t gain us anything, while the dynamic type was Sub object anyway. Simple clarity, left side of assignment is static type, right side is dynamic type (which contains the ‘new’ keyword).
Saturday, October 20, 2007
Iterator Example
import java.util.*; public class HashSetIterator { /** * @A.J, CH 15 */ public static void main(String[] args) { HashSet s = new HashSet(); s.add("House"); s.add("of"); s.add("fun"); s.add("believe"); s.add("Shame"); s.add("woke"); System.out.println("The Set Contains: "); Iterator i = s.iterator(); while (i.hasNext()) System.out.println (i.next()); System.out.println("****End of Contents***"); i.remove(); System.out.println(); System.out.println("The Set _now_ Contains: "); Iterator z = s.iterator(); while (z.hasNext()) System.out.println (z.next()); System.out.println("****End of Contents***"); System.out.println(); System.out.println(); System.out.println("The Java Instructions have come to an END."); } } /* The Set Contains: of woke House fun believe Shame ****End of Contents*** The Set _now_ Contains: of woke House fun believe ****End of Contents*** The Java Instructions have come to an END. */
Wednesday, October 17, 2007
Java Library ArrayList
import java.io.PrintStream; import java.util.*; public class ReadAndReverse { static void readAndReverse (Scanner input, PrintStream output) { ArrayListL = new ArrayList (); while (input.hasNext()) L.add(input.next()); for (int k = L.size() - 1; k >= 0; k -=1) output.printf("%s ", L.get(k)); } public static void main (String [] args) { Scanner inp = new Scanner (System.in); readAndReverse (inp, System.out); } }
Thursday, October 11, 2007
Inserting into an array non-destructively
//insert into an array
public void insert (int nInt, int pos) {
myV[myCt] = myV [myC-1]; //increase the interesting sub-array size
int k = myV.length ;
for (int i = k-1; i >= 0; i--) {
if (i == pos) {
myV[i] = nInt;
break; // done, get out!
}
myV[i] = myV[i-1]; //shift the values down
}
myCt++; //increase the instance var...
}
Singly linked list operations...
public class IntList {
// Names of simple Containers
public int head;
public IntList tail;
// Constructor function
/** List Cell containing (HEAD, TAIL). */
public IntList (int head, IntList tail) {
this.head = head; //Scheme car
this.tail = tail; //Scheme cdr
}
/* Converts an Array of Integers into a Linked List with
* the same elements.
* @param: an Array of integers with > 1 elements
*/
static IntList makeList (int a []) {
IntList X, Z;
X = new IntList (a[0], null);
int i;
for (i = 1, Z = X; i < a.length ; i++, Z = Z.tail){
Z.tail = new IntList (a[i], null);
}
return X;
}
/* Recursive Version */
static IntList makeListr (int a []) {
int i = 0;
IntList X, Z;
X = new IntList (a[0], null);
Z = X;
Z = makelistrhelper (X, a, ++i);
return X;
}
static IntList makelistrhelper (IntList Z, int a [], int i) {
if (i > a.length -1 ){
return Z;
} else {
Z.tail = new IntList (a[i], null);
return makelistrhelper (Z.tail, a, ++i);
}
}
static int countList (IntList Z) {
int countL = 0;
countL = countListH (Z, countL);
return countL;
}
static int countListH (IntList Z, int countL){
if (Z == null)
return countL;
else {
return countListH (Z.tail, ++countL);
}
}
static void printList (IntList Z) {
int i = 0;
IntList M;
for (M = Z; M != null; M = M.tail ) {
System.out.println("Head" + "-" + i +" ---- " + M.head);
i++;
}
}
/** List of all items in P incremented by n. */
static IntList incrList (IntList P, int n) {
if (P == null)
return null;
else return new IntList (P.head+n, incrList (P.tail, n));
}
/** Iterative version */
static IntList incrListIterative (IntList P, int n) {
if (P == null)
return null;
IntList result, last;
result = last
= new IntList (P.head+n, null);
while (P.tail != null) {
P = P.tail;
last.tail = new IntList (P.head+n, null);
last = last.tail;
}
return result;
}
/** List of all items in P incremented by n. May destroy original. */
static IntList dincrList (IntList P, int n) {
if (P == null)
return null;
else {
P.head += n;
P.tail = dincrList (P.tail, n);
return P;
}
}
/** For version */
static IntList forDincrList (IntList L, int n) {
// for is more than a loooooooooper.
for (IntList p = L; p != null; p = p.tail )
p.head += n;
return L;
}
/** The List resulting from removing all instances of X
* from L non-destructively
*/
static IntList removeAll (IntList L, int x){
if (L == null)
return null;
else if (L.head == x)
return removeAll (L.tail, x);
else
return new IntList (L.head, removeAll (L.tail, x));
}
static IntList removeAllIterative (IntList L, int x) {
IntList result, last;
result = last = null;
for ( ; L != null; L = L.tail){
/* L != null and I is true. */
if (x == L.head)
continue;
else if (last == null)
result = last = new IntList (L.head, null);
else
last = last.tail = new IntList (L.head, null);
}
return result;
/** Here, I is the Loop Invariant:
* Result of all elements of L0 not equal to X up to
* and not including L, and last points to the last
* elements of result, if any. We use L0 here to mean
* "the original value of L." *
*/
}
}
Tuesday, October 9, 2007
PascalTriangles once more!
Here we go again...Pascal Triangles once more...by popular demand only....
public class PascalTriangle { public static int [] [] pascalTriangle (int n) { int [][] pt = new int [n][]; for (int i = 0; i < n; i++){ pt[i] = new int [i + 1]; pt[i][0] = 1; for (int j = 1; j < i; j++) { pt[i][j] = pt[i - 1][j - 1] + pt [i -1][j]; } pt[i][i] = 1; } return pt; } public static void printTriangle (int x [][], int n) { for (int i = 0; i < n; i++){ System.out.println(); for (int k = 0; k <= i; k++ ) { System.out.print (" " + x[i][k]); } } } public static void getPascalTriangle (int n) { printTriangle (pascalTriangle (n), n); } public static void main(String[] args) { int G = 30; getPascalTriangle(G); } }
Sieve of Erotosthenes
The fabulous Sieve of EROTOSTHENES once more, if you are already not too sick of it by now!
public class PrintPrimes { public static void printPrimes (int n) { boolean [] prime = new boolean [n + 1]; int i; for (i=2; i <= n; i++ ) { prime[i] = true; } for (int divisor = 2; divisor * divisor <= n; divisor ++) { if (prime[divisor]) { for (i = 2* divisor; i <= n; i = i + divisor) { prime [i] = false; } } } for (i = 2; i <= n; i++ ) { if (prime[i]) { System.out.print (" " + i); } } } public static void main(String[] args) { int G = 10; PrintPrimes.printPrimes(G); } }
Monday, October 8, 2007
Linked List Constructor Functionality Testing
public class IntListTest { public static void main (String [] args) { int [] a = new int [] { 3, 6, 19, 71 }; IntList X = new IntList (0, null); X = X.makeList (a); System.out.println ("List created! "); X.printList(X); IntList Y = new IntList (0, null); int [] x = new int [] { 3, 2, 32, 57, 72, 98, 32, 323 , 232}; Y = Y.makeListr(x); System.out.println ("List created! "); Y.printList(Y); System.out.println ("List Count: " + Y.countList(Y)); } } %java IntListTest List created! Head-0 ---- 3 Head-1 ---- 6 Head-2 ---- 19 Head-3 ---- 71 List created! Head-0 ---- 3 Head-1 ---- 2 Head-2 ---- 32 Head-3 ---- 57 Head-4 ---- 72 Head-5 ---- 98 Head-6 ---- 32 Head-7 ---- 323 Head-8 ---- 232 List Count: 9
The Linked List Maker method
The methods missing from yesterday's post...
public class IntList {
// Names of simple Containers
public int head;
public IntList tail;
// Constructor function
/** List Cell containing (HEAD, TAIL). */
public IntList (int head, IntList tail) {
this.head = head; //Scheme car
this.tail = tail; //Scheme cdr
}
/* Converts an Array of Integers into a Linked List with
* the same elements.
* @param: an Array of integers with > 1 elements
*/
static IntList makeList (int a []) {
IntList X, Z;
X = new IntList (a[0], null);
int i;
for (i = 1, Z = X; i < z =" Z.tail){" tail =" new" i =" 0;" x =" new" z =" X;" z =" makelistrhelper"> a.length -1 ){
return Z;
} else {
Z.tail = new IntList (a[i], null);
return makelistrhelper (Z.tail, a, ++i);
}
}
static int countList (IntList Z) {
int countL = 0;
countL = countListH (Z, countL);
return countL;
}
static int countListH (IntList Z, int countL){
if (Z == null)
return countL;
else {
return countListH (Z.tail, ++countL);
}
}
static void printList (IntList Z) {
int i = 0;
IntList M;
for (M = Z; M != null; M = M.tail ) {
System.out.println("Head" + "-" + i +" ---- " + M.head);
i++;
}
}
}
Simple Linked List operations
Some Simple Linked List operations:
public class IntList {
// Names of simple Containers
public int head;
public IntList tail;
// Constructor function
/** List Cell containing (HEAD, TAIL). */
public IntList (int head, IntList tail) {
this.head = head;
this.tail = tail;
}
/** List of all items in P incremented by n. */
static IntList incrList (IntList P, int n) {
if (P == null)
return null;
else return new IntList (P.head+n, incrList (P.tail, n));
}
/** Iterative version */
static IntList incrListIterative (IntList P, int n) {
if (P == null)
return null;
IntList result, last;
result = last
= new IntList (P.head+n, null);
while (P.tail != null) {
P = P.tail;
last.tail = new IntList (P.head+n, null);
last = last.tail;
}
return result;
}
/** List of all items in P incremented by n. May destroy original. */
static IntList dincrList (IntList P, int n) {
if (P == null)
return null;
else {
P.head += n;
P.tail = dincrList (P.tail, n);
return P;
}
}
/** For version */
static IntList forDincrList (IntList L, int n) {
// for is more than a loooooooooper.
for (IntList p = L; p != null; p = p.tail )
p.head += n;
return L;
}
/** The List resulting from removing all instances of X
* from L non-destructively
*/
static IntList removeAll (IntList L, int x){
if (L == null)
return null;
else if (L.head == x)
return removeAll (L.tail, x);
else
return new IntList (L.head, removeAll (L.tail, x));
}
static IntList removeAllIterative (IntList L, int x) {
IntList result, last;
result = last = null;
for ( ; L != null; L = L.tail){
/* L != null and I is true. */
if (x == L.head)
continue;
else if (last == null)
result = last = new IntList (L.head, null);
else
last = last.tail = new IntList (L.head, null);
}
return result;
/** Here, I is the Loop Invariant:
* Result of all elements of L0 not equal to X up to
* and not including L, and last points to the last
* elements of result, if any. We use L0 here to mean
* "the original value of L." *
*/
}
}
Sunday, October 7, 2007
Old blogs before Day 0.
// Copy of blogs from some other place. That service is really frustrating. Relocating here....
October 7, 2007 - Sunday
Constructor variables!
Instance variables should not be re-declared in the constructor.
This is easy to do mistakenly...For example:
public class Mt{
int height;
int length;
int iRep;
// the following is the wrong way to do it. We are basically redeclaring the instance
// vars and height, length, iRep all will be set to zero!!!!!!!!!!
// Because height, length and iRep will be set to local variables, the constructor is
// nothing more than a method and as such, these variables' set values will die after the
// constructor is finished and we will revert back to the default values for these variables
// which is zero as the class did not initialize them to anything!
// height = length = iRep = 0 is the result of the following!
public Mt (int ht, int ln) {
int height = ht;
int length= ln;
int iRep = iRepC (ht, ln);
}
// Correct way:
// get rid of the type declarations..
// The type is already declared in the class.
// No need to redeclare...
public Mt (int ht, int ln) {
height = ht;
length= ln;
iRep = iRepC (ht, ln);
}
4:43 AM -
Junit Test Case Framework Current mood: calm
Bare Skeleton junit TestCase frame work. We absolutely need the following.
First we need to import the junit.framework.TestCase:
import junit.framework.TestCase;
Then this is the TestClass that is created by Eclipse®. The Class that we are working with here is called 'Whatever'. So, this 'Whatever' Class will extend the TestCase class...
public class WhateverTest extends TestCase {
The first test is for the Constructor of the class. Imagine there is some static int in the Whatever class that is a class variable, and instantiating any object of whatever class would set this to 1000. And the what() method of Whatever Class would return this value. So, we create a testConstructor method which would create the object 'w' and then assertTrue on checking to see if Whatever.what() returns the expected value of 1000.
public void testConstructor ( ) { Whatever w = new Whatever ( ); assertTrue (Whatever.what () == 1000); }
Then we have other method tests. Let's have a test on some method of the 'Whatever' class called whyWhatever(). Why whyWhatever does something to that same class var and should return 2000.
public void testIncrement ( ) { Whatever w = new Whatever ( ); w.whyWhatever( ) ; assertTrue (w.what() == 2000); } If everything's going Ok, then the test cases will succeed. And we will have the green bars in Eclipse after running the Junit Test cases.
2:12 AM
October 6, 2007 - Saturday
Arguments are passed by Value in Java!!!!!!! Current mood: curious
Arguments in Java are all passed by value. This implies that each argument is copied into the corresponding method parameter in the method being called. If the parameter is a reference, the mechanics of method operation on that parameter is the same when an assignment statement involves two references. In box-and-pointer terms, the copy results in two arrows pointing to the same box. The method call may work with the object reference and do all sorts of things to the reference(s). But at the end of the day, the method parameters live on the frame stack on the heap and they all die when the method is finished. Nothing persists!!!
What this means in reality is that an argument of a primitive type can't be changed in a method to which it is passed, since the method is working with not with the actual primitive but rather a copy of that primitive. A reference argument likewise can not be changed either, by the same token. However, variables in the referenced object can be changed.
In short for variables within an object to change, some kind of dot operator (.), will be there within the method body. It might not change stuff, but if you don't see the dot operator, then you know that nothing in the object will be changed in this method!
4:05 PM
Ok....set the spam meter high... Current mood: aggravated
http://profileedit.myspace.com/index.cfm?fuseaction=accountSettings.spam
but this is kind of bad as nobody else can send me invites now, the admin
should just kick out sex peddlers out of this space or open up a mySEXspace.com or something for people inclined towards that kind of thing!
12:37 AM - 0 Comments - 0 Kudos - Add Comment - Edit - Remove
What are all these stupid invites??? Current mood: angry
Getting a whole bunch of spam! Just checked my email and there were like 50 emails talking about wanting to be my 'friend'! All of those some scam, it's funny that there is a option to select all and deny but not the option to report the whole bunch as scam/spam! Myspace should have it, otherwise, this website will become unusable. The admin should do something about these spammers. Why send these objectionable peoples' pics and stuff to my control panel or send me email!?!?!
12:31 AM
Object Refernces..... Current mood: amused
Just to reiterate something that is pretty obvious but seems to trip you off
all the time, is this issue with object references. Say we have two objects
xA and xB. And each has a two element array. Lets call them xA1, xA2 and
xB1 , xB2.
Then if we make the following assignments...
xB1 = xA1;
xB2 = xA2;
And then further do the following:
xA2 = xA1;
Then if we follow the object reference logic, xA1, xA2 and xB2 all would
have the same values but xB1 would continue to have the old value of xA2!
If we draw the diagram out, it all makes sense!
xA -------> xA1 <----------xB2 <--------------xB ---------->xA2 <----------xB1 <-------------- After the last set of assignments: xA---------->xA1 <--------- xA2 ^ xB2 ---------------- xB---------->xB1------------>(old) xA2
This is because after the first set of assignemnts, the object pointed to by
xA2 and xB1 are the same, however, when we assign the reference given
by xA2 to some other object, this does not automatically reassign the reference
given by xB1. They were pointing to the same thing, however, after
re-assignment of xA2, xB1 is still pointing to it's old thing and xA2 has moved
on. The crutial thing to understand is that xA2 and xB1, i.e. objects or arrays
are not actually values but rather references and thus the '=' sign is not
mathematically equal sign, it is ASSIGNMENT! And since these are object
reference assignments, when one changes to refer to another object, the other
does NOT change!
p.s. the diagrams are simplifications, xA1 or xB1 does not point to each other
or something like that, what is simplified is that, xA1 points to something
and xB1 points to that same thing or some other thing. They can't point to each
other they can only point to some same object on the garbase collectible heap!
..........and that's the whole point!
11:56 AM
October 5, 2007 - Friday
String Compare Blues... Current mood: bouncy
Finally got the string compare joy thing figured out...
The following would return true for mString == FUSD and s == USA.
***********
return (mString.substring(1).compareTo (s) == 0) ? true : false ;
***********
This is the zems of pearl from javadocs (javadocs is ®of your buddy Sun and I guess opensource and all that, so, quoting should be kosher)
If the (javadocs - following) makes 100% sense to you then you must be
compareTopublic int compareTo(String anotherString)
Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argument string. The result is a negative integer if this String object lexicographically precedes the argument string. The result is a positive integer if this String object lexicographically follows the argument string. The result is zero if the strings are equal; compareTo returns 0 exactly when the equals(Object) method would return true.
substringpublic String substring(int beginIndex)
Returns a new string that is a substring of this string. The substring begins with the character at the specified index and extends to the end of this string.
substringpublic String substring(int beginIndex, int endIndex)
Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.
charAtpublic char charAt(int index)
Returns the char value at the specified index. An index ranges from 0 to length() - 1. The first char value of the sequence is at index 0, the next at index 1, and so on, as for array indexing.
3:03 PM
Object recursion
Phew!!!!!!!! This code finally worked...my first recursive objects.........took me
a while to figure this out. Especially confusing was to get the right object
to call the recursive call on!
.r{}*
There's some junk in this code and needs to get polished up, but it's working
and that's good enough for now...As we all know, we can chase down the
perfect code all day long and possibly spend a week on a ten liner but
have to move on...In my thinking, it's also very important to stop at some point
from the dangerous recursive call to
beatify(timeAndResourse);
:)
*/
.r{}* @param Call with this and this.mBalance
* this is tail recusive, in that f() returns
* itself with a smaller problem.
*/
public int recursiveBalance (Account someAccount , int lance) {
if (someAccount.parentAcc != null) {
Account tmpy = new Account(0);
tmpy = someAccount;
return recursiveBalance (tmpy.parentAcc, lance +
tmpy.parentAcc.mBalance) ;
} else {
return lance + mBalance;
}
}
.r{}* Putting the code here so that I can come back later
* and appreciate how stupidly I coded, way back when!
* err....hopefully...of course!
*/
10:40 AM
October 4, 2007 - Thursday
The Indredible Lightness of Being Current mood: depressed
Want to recommend a great book that I finished up...
Incredible lightness of being by Milan Kundera
A great book to ponder on. There are some really thought provoking motifs
explored in the book.
After reading this book you keep on thinking, "must it be so?".
And that's a very pertinent question in anybody's life.
Also another theme about the fact that we get to live only once and whatever
we do is like an actor temporizing without rehearsing is very interesting.
Reminds you of the Doors line:
Into this house we're bornInto this world we're thrownLike a dog without a boneAn actor on a loan
It seems emimently possible that there are no second chances and the
trajectories that our lives take has no back tracing. We get one chance
every moment and at the end of the end, what can we do but do what
we do???
2:00 AM -
I/O example
.r{}* input and output examples
* first is just reading a line from keyboard and spewing it back.
* ISR takes System.in and BR takes this and we assign this to the BR object
* keybd
*/
import java.io.*;
public class SS01 {
.r{}*
* @param keybd and call readLine() on it and print it
*/
public static void main(String[] args) throws Exception {
BufferedReader keybd = new BufferedReader (new InputStreamReader (System.in));
System.out.println(keybd.readLine());
}
}
.r{}* Reading from a webpage.
*/
import java.io.*;
import java.net.*;
public class SSWebLine {
.r{}*
* @param takes an URL as arg and prints out on the console
*/
public static void main(String[] args) throws Exception {
URL u = new URL ("http://www.yahoo.com");
InputStream Ins = u.openStream();
InputStreamReader Isr = new InputStreamReader(Ins);
BufferedReader yahooCom = new BufferedReader (Isr);
System.out.println(yahooCom.readLine());
}
}
Subscribe to:
Posts (Atom)
Just some daily notes ...
Things I'm into now...
Blog Archive
-
▼
2007
(29)
-
▼
November
(14)
- Declaring an Edge Adjacency List Graph
- MaximallyBalanced or Complete Binary Tree
- Calculating the Height of a Tree
- Adding to a Circular Doubly Linked List
- 3 ways to REVERSE a list (singly linked)
- Reversing a List Iteratively!
- Doubling a Linked List
- Access Modifiers: public, private, proctecd, packa...
- End of HFJ
- Format Specifiers
- Collection class tidbits...
- Generic class definitions and one implementation
- doubling a List
- Don't Forget Your Scheme!
-
►
October
(15)
- Deconstructing a Scheme recursive function and imp...
- Anasi Boys
- Iterator for Collection and Nested Class
- The Uninvited!
- Inheritence and PolyMorphIsm
- Iterator Example
- Java Library ArrayList
- Inserting into an array non-destructively
- Singly linked list operations...
- PascalTriangles once more!
- Sieve of Erotosthenes
- Linked List Constructor Functionality Testing
- The Linked List Maker method
- Simple Linked List operations
- Old blogs before Day 0.
-
▼
November
(14)