采访问题是编写此方法以删除数组中的重复元素。
public static Array removeDuplicates(Array a) {
...
返回类型为java.lang.reflect.Array
,参数也为java.lang.reflect.Array
类型。
如何为任何数组调用此方法?
也不确定我的实施:
public static Array removeDuplicates(Array a)
{
int end=Array.getLength(a)-1;
for(int i=0;i<=end-1;i++)
{
for(int j=i+1;j<=end;j++)
{
if(Array.get(a, i)==Array.get(a, j))
{
Array.set(a, j, Array.get(a, end));
end--;
j--;
}
}
}
Array b=(Array) Array.newInstance(a.getClass(), end+1);
for(int i=0;i<=end;i++)
Array.set(a, i, Array.get(a, i));
return b;
}
答案 0 :(得分:0)
此代码存在各种问题。从这里开始:
get()
请注意,equals()
次调用会返回对象。因此,当您传入一个字符串数组时,与==进行比较很可能会导致错误的结果(因为许多实际上相等的对象仍然具有不同的引用---所以你的支票一直返回 false !)
所以,要改变的第一件事是:使用end--;
代替==!
另一个问题是:
int numberOfOutgoingItems = end;
说真的:你永远不会更改控制for循环的变量。
相反:有另一个柜台,比如
get(Object array, int index)
然后减少 计数器!
关于你的最后一个问题 - 检查javadoc;例如get()。这是 int a[] = ...;
Object oneValue = Array.get(a, 0);
所以你应该能够做类似的事情:
getInt()
例如。
<强>声明即可。我不得不承认:我不知道Array实现是否智能足以自动将int []的元素转换为Integer对象。
很可能你必须首先编写代码来检测数组的确切类型(例如,如果它是int数组);而是拨打getObject()
而不是{{1}}。
除此之外,还可以找到一些有关如何使用反射/数组的进一步阅读here
答案 1 :(得分:0)
您可能需要考虑使用不同的数据结构(如hashmap)来检测重复项(O(1)),而不是使用嵌套for循环(O(n ^ 2))进行循环。它应该给你更好的时间复杂性。