2014-02-20 53 views
-1

我这段代码是找到indexOf 3个元素中的array,所以我用了java.util ..等等,但是它给了我那个错误,结果是-1,如何避免这个错误的答案,并有另一种方式来写这个代码indexOf int数组元素

int array [] = {1,0,1,0,0,1,1,0,1,1}; 
for(int counter = 0 ; counter < 3; counter++) 
    System.out.printf("%5d%8d\n",java.util.Arrays.asList(array). 
     indexOf(array[randomNumbers.nextInt(10)]),array[randomNumbers.nextInt(10)]); 

回答

2

你必须使用包装类 “INT”

SecureRandom randomNumbers = new SecureRandom(); 

    Integer array[] = { 1, 0, 1, 0, 0, 1, 1, 0, 1, 1 }; 
    for (int counter = 0; counter < 3; counter++) 
     System.out.printf("%5d%8d\n", java.util.Arrays.asList(array).indexOf(array[randomNumbers.nextInt(10)]), array[randomNumbers.nextInt(10)]); 

的(编辑 - 2014年3月2日)

嗨,我的第一个答案是错误的,检查新:

SecureRandom randomNumbers = new SecureRandom(); 

/** 
* I don't know why but when you create an array with only primitive 
* contained "unnamed block" like "Integer array[] = {1,0,1}". JVM 
* associate same referance variables with same values like "Integer 
* array[] = {@34, @554, @34}". That is why i use "new Integer" 
* constractor for each integer as follows: 
*/ 
Integer array[] = new Integer[] { new Integer(1), new Integer(0), 
     new Integer(1), new Integer(0), new Integer(0), new Integer(1), 
     new Integer(1), new Integer(0), new Integer(1), new Integer(1) }; 

int ran, i; 
for (int counter = 0; counter < 3; counter++) { 
    ran = randomNumbers.nextInt(10); 
    i = 0; 
    /** 
    * "List.indexOf" method uses "object1.equals(object2)" method, this 
    * method compares "values" of wrapper classes, but in your case 
    * we have to compare referances, so with nested "for" loops we 
    * check that: 
    */ 
    for (Integer integer : array) { 
     if (integer == array[ran]) { // "==" operator checks referances is same 
      System.out.printf("%5d%8d\n", i, ran); 
      break; 
     } 
     i++; 
    } 
} 
+0

因为当你通过“... indexOf(array [randomNumbers.nextInt(10)])”'int'自动转换为Integer。这个新的“Integer”对象与之前添加的不同。 – veysiertekin

+1

不,实际上,问题是在一个基元数组上调用'Arrays.asList'(参见http://stackoverflow.com/questions/1467913/arrays-aslist-not-working-as-it-应该) – trutheality

+0

谢谢,但它不正确。 – Ashrafchek

2

我不知道如果我得到了答案,但尝试你的代码分解成可读行。而您的原始数组应为Integer[]而不是int[]。请注意0​​创建List<int[]>

Random randomNumbers = new Random(); 

    Integer array [] = {1,0,1,0,0,1,1,0,1,1}; 
    for(int counter = 0 ; counter < 3; counter++) 
    { 
     int randomItemFromArray = array[randomNumbers.nextInt(10)]; 
     List<Integer> listOfInts = Arrays.asList(array); 
     int indexOfRandomItem = listOfInts.indexOf(randomItemFromArray); 

     System.out.printf("%5d%8d\n", indexOfRandomItem , randomItemFromArray); 
    } 

这可能有所帮助。

+1

如果你把'randomNumbers.nextInt(10)'放到一个变量中,你甚至不需要使用'List.indexOf()'。 –

+0

谢谢,但它没有工作,它给我-1。 – Ashrafchek

+0

@NandkumarTekale我认为这个练习的目的是使用'List.indexOf()'。你的编辑改变了我的答案。 – vegemite4me

1

问题与int[]阵列本身,因为当你使用任何基本数组,并将其转换为List using Arrays.asList()它会返回一个List<int[]>没有List<Integer>从而与您的代码中出现的问题。解决创建array of Integer (Wrapper class)

Integer[] array = {1,0,1,0,0,1,1,0,1,1}; 
1

为什么你的代码失败:

这是相关的: Arrays.asList() not working as it should?

您上int[]调用Arrays.asList。这不会产生预期的结果,因为Arrays.asList被设置为使用数组Object s,而不是原语。结果是一个元素的列表,该元素是您的int[]数组(因为原始数组Object,就像任何其他数组)。

的解决方案:

  • 你已经知道你的索引。你正在设置它。不需要查看它。将它保存在一个变量中。我喜欢短代码,但有时候短代码会变得更糟,而且运行速度会比略长的代码慢。 NBD如果你不适合整个程序在一条线上。 - 或 -
  • 如果您仍然认为需要索引查找,请使用整数对象数组(Integer[])。