使用java在数组中查找具有不同绝对值的数字

时间:2016-03-24 14:19:10

标签: java arrays loops absolute

我正在尝试编写一个打印出具有唯一绝对值的数字的程序。 这是我的尝试:

import java.util.*;
public class MyClass {

     static ArrayList<Integer> aCopy;

    public static void main(String[] args)

    {
        int myArray[]= {-5, 4,-6,8,-4,6,13};

        System.out.println(Arrays.toString(myArray));

        aCopy = new ArrayList<>();
        for(int i=0; i<myArray.length; i++)
        { aCopy.add(myArray[i]); }

       System.out.println("Numbers with unique abs. value are:");
       findDifferentAbsoluteValues(myArray);
       System.out.println(aCopy);   
    }

     public static boolean findDifferentAbsoluteValues (int[] anArray)  
     {      
      for (int i=0; i<anArray.length;i++)
      {
        for(int j=i+1;j<anArray.length; j++)
        {
            if ( Math.abs(anArray[i]) == Math.abs(anArray[j]) ) 
            {
            aCopy.remove(anArray[i]);
            return false;
            }           
        }
      }
      return true;
     } 
}

但是输出不正确。我不是(还)非常流利的java所以它不是我主要关心的解决方案是优雅的,只需要它工作))任何人都可以解决一些错误,请吗?

5 个答案:

答案 0 :(得分:1)

在Java 8+中,您可以使用IntStream.map(IntUnaryOperator)获取绝对值,然后使用IntStream.distinct()获取唯一值,最后使用IntStream.forEach(IntConsumer)打印它。像,

int[] myArray = { -5, 4, -6, 8, -4, 6, 13 };
IntStream.of(myArray).map(Math::abs).distinct().forEach(System.out::println);

答案 1 :(得分:1)

我理解你想要采取一系列不同的绝对值的问题。 第一个错误的

aCopy.remove(anArray[i]);

它不能删除具有相同值的这些。您找到相同的值,但anArray[i]不值得删除。例如:i = 1 anArray [1] = 4.您将删除此

aCopy.remove(4);/* because anArray[1] = 4*/

第二个错误不要返回false。因为循环没有完成。

我通过以下方式理解问答;

 public static void main(String[] args)
    {
        int myArray[]= {-5, 4,-6,8,-4,6,13};

    System.out.println(Arrays.toString(myArray));

    aCopy = new ArrayList<>();

   System.out.println("Numbers with unique abs. value are:");
   findDifferentAbsoluteValues(myArray);
   System.out.println(aCopy);     
}

public static void findDifferentAbsoluteValues (int[] anArray)  
{      
     for (int i=0; i<anArray.length;i++)
     {
         Boolean dif =true;
       for(int j=i+1;j<anArray.length; j++)
       {
           if ( Math.abs(anArray[i]) == Math.abs(anArray[j]) ) 
           {
               dif = false;
           }           
       }
       if(dif == true)
       aCopy.add(anArray[i]); //if you want absolute value aCopy.add(Math.abs(anArray[i])) 
     }
    }

答案 2 :(得分:1)

您的(主要)问题是您的函数findDifferentAbsoluteValues在删除第一个“重复”之后停止,而您正在迭代的列表中删除不小心的元素。以下是一些可以帮助您改进代码的指示:

  • 你需要保留原始阵列吗?如果不这样做,请直接使用ArrayList myArray,不要将其复制
  • 您是否需要保留原始数组,您的函数应该直接使用ArrayList作为参数,而不是对全局(static)变量进行操作
  • 您不需要功能结果,因此findDifferentAbsoluteValues应该返回void

对于函数findDifferentAbsoluteValues中的算法:

  • 第一次找到两个具有相同绝对值的整数时,它不应该停止
  • 尝试逐步手动(或者更好,在调试器的帮助下)查看您的函数在示例中发现的问题

修改:以下是解决方案的示例:

import java.util.ArrayList;
import java.util.Arrays;

public class MyClass {
    // You don't need a global variable here
    public static void main(String[] args)
    {
      Integer[] myArray = {-5, 4, -6, 8,-4, 6, 13, 4, 4};
      // Copy the array using the constructor of ArrayList on a collection
      ArrayList<Integer> aCopy = new ArrayList<Integer>(Arrays.asList(myArray));

      System.out.println("Original array: " + Arrays.toString(myArray));
      findDifferentAbsoluteValues(aCopy);
      System.out.println("Numbers with unique abs. value are: " + aCopy);
    }

    // Takes an array as argument and works on it directly.
    // Returns void since no return value is necessary.
    public static void findDifferentAbsoluteValues (ArrayList<Integer> anArray)  
    {
      for (int i = 0; i < anArray.size(); i++)
          for (int j = i + 1; j < anArray.size(); j++)
              if (Math.abs(anArray.get(i)) == Math.abs(anArray.get(j)))
                  // Removes the second one and decrement to avoid forgetting any element
                  anArray.remove(j--);
    }
}

答案 3 :(得分:0)

在方法findDifferentAbsoluteValues此处aCopy.remove(anArray[i]);首先,您必须找到要删除的元素的索引,然后将其删除,否则可以提供ArrayIndexOutOfBoundsException

if ( Math.abs(anArray[i]) == Math.abs(anArray[j]) ) 
{
     aCopy.remove(anArray[i]);
     return false;
}  

发现匹配后,您正在从函数返回,这是不对的,因为您还必须继续检查其他数字。 因此,将return替换为break语句。还要删除boolean返回类型,因为它没用,将其更改为void,因为您没有使用返回在任何地方都有价值。

public static void findDifferentAbsoluteValues (int[] anArray)

您的代码应如下所示:

public static void findDifferentAbsoluteValues (int[] anArray)  
 {      
      for (int i=0; i<anArray.length;i++)
      {
        for(int j=i+1;j<anArray.length; j++)
        {
            if ( Math.abs(anArray[i]) == Math.abs(anArray[j]) ) 
            {
            aCopy.remove(aCopy.indexOf(anArray[i]));
            break;
            }           
        }
      }
 }

它对我有用。

答案 4 :(得分:0)

你们都是对的。我弄乱了内循环,因为我记得我前段时间写的一个函数,它检查一个数字是否为素数,使用return语句是有意义的。 非常感谢所有回复我帖子的人。复活节快乐!