Solved

JAVA generics

Posted on 2014-02-22
8
497 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
8 Comments
 
LVL 28

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 28

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
Optimize your web performance

What's in the eBook?
- Full list of reasons for poor performance
- Ultimate measures to speed things up
- Primary web monitoring types
- KPIs you should be monitoring in order to increase your ROI

 
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 28

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

Get 15 Days FREE Full-Featured Trial

Benefit from a mission critical IT monitoring with Monitis Premium or get it FREE for your entry level monitoring needs.
-Over 200,000 users
-More than 300,000 websites monitored
-Used in 197 countries
-Recommended by 98% of users

Question has a verified solution.

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

"Disruption" is the most feared word for C-level executives these days. They agonize over their industry being disturbed by another player - most likely by startups.
In this post we will learn different types of Android Layout and some basics of an Android App.
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

623 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