Solved

JAVA generics

Posted on 2014-02-22
8
483 Views
Last Modified: 2014-02-23
I was wondering if someone could explain this syntax.

I'm working on an implementation of a HashTable with chaining. My rehash function looks like this:

    private void rehash() {
        DoublyLinkedList<Entry<K, V>>[] oldTable = table;

        table = new DoublyLinkedList[2 * oldTable.length];
        numKeys = 0;

        for( DoublyLinkedList<Entry<K, V>> bucket : oldTable ){
            if( bucket != null ){
                for(Object entry : bucket){
                    Entry<K,V> e = (Entry<K,V>) entry;
                    put((K) e.getKey(), (V) e.getValue() );
                }
            }
        }
    }

Open in new window


This was the only way I was able to get it to compile.

What I don't understand is why in the inner loop I have to say entry is an Object, and then cast it to Entry<K,V> e inside the loop. It seems weird to do it this way. I *think* I have tried every other permutation, such as: for(Entry entry : bucket)... etc... to no avail.

Thanks,
Koza
0
Comment
Question by:Kyle Hamilton
  • 5
  • 3
8 Comments
 
LVL 27

Expert Comment

by:dpearson
ID: 39879882
I think you should be using Map.Entry<K,V> instead of just Entry<K,V>.

Then you can use:

    for(Map.Entry<K,V> entry : bucket)  { }

This compiles just fine for me:

import java.util.LinkedList;
import java.util.Map;

public class MyTest<K,V> {

	private LinkedList<Map.Entry<K, V>>[] table ;

	private void rehash2() {
		LinkedList<Map.Entry<K, V>>[] oldTable = table;

		table = new LinkedList[2 * oldTable.length];
		int numKeys = 0;

		for( LinkedList<Map.Entry<K, V>> bucket : oldTable ){
			if( bucket != null ){
				for(Map.Entry<K,V> entry : bucket){
					put(entry.getKey(),entry.getValue() );
				}
			}
		}
	}
	
	private void put(K key, V value) { }

}

Open in new window


Doug
0
 
LVL 25

Author Comment

by:Kyle Hamilton
ID: 39879905
hi Doug,

the thing is, i'm trying to use my own *schmucky* data structures :), hense, DoublyLinkedList.

do you think the problem could be in my DoublyLinkedList?

thanks,
Koza
0
 
LVL 27

Accepted Solution

by:
dpearson earned 500 total points
ID: 39879957
I guess it's possible, but you should certainly be fine to replace LinkedList with your own class.

E.g. This also compiles:

public class MyTest<K,V> {
	public static class DoublyLinkedList<E> extends LinkedList<E> {
	}
	
	private void rehash() {
		DoublyLinkedList<Map.Entry<K, V>>[] table = null ;
		DoublyLinkedList<Map.Entry<K, V>>[] oldTable = table;

		table = new DoublyLinkedList[2 * oldTable.length];
		int numKeys = 0;

		for( DoublyLinkedList<Map.Entry<K, V>> bucket : oldTable ){
			if( bucket != null ){
				for(Object entry : bucket){
					Map.Entry<K,V> e = (Map.Entry<K,V>) entry;
					//put((K) e.getKey(), (V) e.getValue() );
				}
			}
		}
	}

	private DoublyLinkedList<Map.Entry<K, V>>[] table ;

	private void rehash2() {
		DoublyLinkedList<Map.Entry<K, V>>[] oldTable = table;

		table = new DoublyLinkedList[2 * oldTable.length];
		int numKeys = 0;

		for( DoublyLinkedList<Map.Entry<K, V>> bucket : oldTable ){
			if( bucket != null ){
				for(Map.Entry<K,V> entry : bucket){
					put(entry.getKey(),entry.getValue() );
				}
			}
		}
	}

	private void put(K key, V value) { }

}

Open in new window


And of course you could write your own DoublyLinkedList<E> class from scratch instead of just subclassing an existing list.

The key for supporting the "for x : y" syntax is whether you implement the iterable interface: http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html

Doug
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
LVL 25

Author Comment

by:Kyle Hamilton
ID: 39880012
yes. I implemented iterable (see snippet). That is the only piece from java.util I'm using.

@Override
	public Iterator<E> iterator(){
		return new Iter();
	};
	
	private class Iter extends DoublyLinkedList<E> implements Iterator<E> {
// more stuff

Open in new window


I would like to be able to do this without using java.util.Map; Is it possible?

It seems my DoubleLinkedList works for everything else I've done with it, so maybe I've screwed up my iterator implementation somehow.
0
 
LVL 25

Author Closing Comment

by:Kyle Hamilton
ID: 39880047
ok, so I ran your code as is, and it compiles, of course. Then I used my implementation of DoublyLinkedList, and I get the error I'm getting in my own code. This would suggest there is something wrong with my linked list implementation. back to the drawing board.


thanks again.
Koza.
0
 
LVL 27

Expert Comment

by:dpearson
ID: 39881248
If you want to post the code for DoublyLinkedList (perhaps start another question?) I'll be happy to have a look and see if we can sort out where the problem is.

I'd focus on the type returned by the iterator() method to start with...

Doug
0
 
LVL 25

Author Comment

by:Kyle Hamilton
ID: 39881325
Thanks Doug,

I'll post another question. I had several implementations of Iterator. all of them worked, and all of them with the same side effect. I thought the fault lay with my iterator, but I don't think so anymore. It's gotta be something else.
0
 
LVL 25

Author Comment

by:Kyle Hamilton
ID: 39881346
OMG, I fixed it. I'm such a dope. I forgot to add the Type to Iterable, like this:

public class DoublyLinkedList<E> implements DoublyLinkedListInt<E>, Iterable<E>{}

 I'm gonna leave that other question open to see what else pops up :)

You're the best, Thank you!
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article explores the design of a cache system that can improve the performance of a web site or web application.  The assumption is that the web site has many more “read” operations than “write” operations (this is commonly the ca…
If you haven’t already, I encourage you to read the first article (http://www.experts-exchange.com/articles/18680/An-Introduction-to-R-Programming-and-R-Studio.html) in my series to gain a basic foundation of R and R Studio.  You will also find the …
The viewer will learn how to implement Singleton Design Pattern in Java.
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.

821 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question