2017-02-01 35 views
0

面试问题是编写这种方法来删除数组中的重复元素。使用java.lang.reflect.Array对数组进行排序需要帮助

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; 
} 
+1

你不妨考虑先排序你的数组... – UKMonkey

+0

你的问题是什么? –

+0

假设阵列预分类。我的问题是如何将int数组或任何数组转换为数组类型,并将其作为参数传递给此方法。在访问方法声明只给出并被告知删除重复元素。 –

回答

0

有各种各样的问题与此代码。从这里开始:

if(Array.get(a, i)==Array.get(a, j)) 

请记住,这些get()调用返回对象。所以,当你传入一串字符串时,与==相比很可能会导致错误结果(因为许多对象实际上是等于仍然有不同引用---所以你的检查返回所有的时间!)

所以,第一件事要改变:使用equals()而不是==!

另一个问题是:

end--; 

认真:你永远更改您的回路控制变量。

相反:有另一个柜台,像

int numberOfOutgoingItems = end; 

,然后降低柜台!

对于你最后的问题 - 检查javadoc;例如对于get()。读取get(Object array, int index)

所以,你应该可以这样做:

int a[] = ...; 

Object oneValue = Array.get(a, 0); 

例如。

免责声明。我不得不承认:我不知道Array实现是否足以将int []的元素自动转换为Integer对象,并且它的灵巧度为smart

它很可能是必须先编写代码来检测数组的确切类型(如果它是一个int数组)例如;改为拨打getInt()而不是getObject()

除此之外,一些进一步阅读如何使用反射/阵列可以发现here

+0

感谢您将记住关于循环和等于()。你可以告诉我如何调用时,像我创建一个int [] a = {1,1,1,2,2,2,3,4,4 ,4,5,6,6,7}现在如何在我的方法中传递这个数组? –

0

您可能需要考虑使用不同的数据结构,诸如哈希映射来检测重复的(O(1)),而不是循环嵌套for循环(O(n^2))。它应该给你更好的时间复杂性。

+1

他问如何解决一个问题**给定** java.lang.reflect.Array。有什么要告诉他使用其他课程? – GhostCat

+0

@GhostCat我想我只是做了一些假设,因为这是一个面试问题(因为没有提到任何限制)。但你是对的:) –

+0

是的,他们希望我使用java.lang.reflect.Array来解决,因为只给出了方法声明,并提到从数组中删除重复的元素 –