Hey, I'm trying to implement the ShellSort algorithm and now I got a problem:
warning: [unchecked] unchecked cast
found : java.util.Vector
required: java.util.Vector<java.lang.Object>
Vector<Object> vcur = (Vector<Object>)currentCols[tcur];
Same with vtmp
.
I don't know where the problem is. It would be really great if you could help me. :)
This is my code:public static Vector<Object> shellSort(Vector<Object> ul) {
int lcount = ul.size();
int colcount = 4; // 2^x
Vector[] currentCols = { ul };
for(; colcount > 0; colcount = (colcount / 2)) {
Vector[] tmpCols = new Vector[colcount];
for(int t1 = 0; t1 < colcount; t1++) {
tmpCols[t1] = new Vector<Object>();
}
int tcur = 0;
int tcurlvl = 0;
int ttmp = 0;
for(int t2 = 0; t2 < lcount; t2++) {
Vector<Object> vcur = (Vector<Object>)currentCols[tcur];
Vector<Object> vtmp = (Vector<Object>)tmpCols[ttmp];
vtmp.addElement((Object)开发者_开发知识库vcur.elementAt(tcurlvl));
// step to next place
tcur++;
ttmp++;
if(tcur == currentCols.length) { tcur = 0; tcurlvl++; }
if(ttmp == tmpCols.length) { ttmp = 0; }
}
}
return ul;
}
I believe the problem here is type erasure. At run-time, Vector is simply Vector. For example:
Vector<String> stuff = new Vector<String>()
Vector<Object> objects = (Vector<Object>)stuff
It will compile, but fail at runtime when you try to put an Int into objects.
This still won't fix the issue (you code doesn't work... never sorts) but it is updated to use List instead of Vector (Vector is obsolete, cannot be deprecated since official APIs depend on it). Unless you need the synchronization built into Vector use List/ArrayList instead.
I also changed the array creation to be closer to generic (cannot truly do generic array creation).
Finally I made the whole method generic so that it can work typesafely with things other than Object (so a List or List, etc...).
It still gives warnings though. Perhaps you should work on getting the code to work properly before you worry about this particular warning (normally I would not suggest that, but with generics that can sometimes be a better way to do it).
public static <T> List<T> shellSort(List<T> ul)
{
int lcount = ul.size();
int colcount = 4; // 2^x
List<T>[] currentCols = (List<T>[])Array.newInstance(List.class, 1);
currentCols[0] = ul;
for(; colcount > 0; colcount = (colcount / 2))
{
List<T>[] tmpCols = (List<T>[])Array.newInstance(List.class, colcount);
for(int t1 = 0; t1 < colcount; t1++)
{
tmpCols[t1] = new ArrayList<T>();
}
int tcur = 0;
int tcurlvl = 0;
int ttmp = 0;
for(int t2 = 0; t2 < lcount; t2++)
{
List<T> vcur = currentCols[tcur];
List<T> vtmp = tmpCols[ttmp];
vtmp.add(vcur.get(tcurlvl));
// step to next place
tcur++;
ttmp++;
if(tcur == currentCols.length) { tcur = 0; tcurlvl++; }
if(ttmp == tmpCols.length) { ttmp = 0; }
}
}
return ul;
}
Why are you declaring currentCols
?
Vector[] currentCols = { ul };
This array always contains one element - the ul
. Just replace currentCols[..]
with ul
and the error will also go away.
精彩评论