有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图写一个程序,打印出具有唯一绝对值的数字。 以下是我的尝试:

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) 个答案

  1. # 1 楼答案

    在方法findDifferentAbsoluteValues中,这里aCopy.remove(anArray[i]);首先必须找到要删除的元素的索引,然后删除它,否则它可以给出ArrayIndexOutOfBoundsException

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

    在找到不正确的匹配项后,您将从函数返回,因为您还必须继续检查其他数字。 因此,用break语句替换return。也要去掉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;
                }           
            }
          }
     }
    

    这对我很管用

  2. # 2 楼答案

    在Java8+中,可以使用^{}来获取绝对值,然后使用^{}来获取唯一值,最后使用^{}来打印它。比如

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

    我理解你想取一系列不同的绝对值的问题。 先错

    aCopy.remove(anArray[i]);
    

    它不能删除这些,因为它们具有相同的值。您发现相同的值,但anArray[i]不值得删除。例:i=1数组[1]=4。你会删除这个

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

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

    我对问题和答案的理解如下:

     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])) 
         }
        }
    
  4. # 4 楼答案

    你们都是对的。我搞乱了内部循环,因为我想到了一个我不久前写的函数,它检查一个数字是否为素数,在这里使用return语句是有意义的。 非常感谢所有回复我帖子的人。复活节快乐

  5. # 5 楼答案

    你的(主要)问题是,你的函数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--);
        }
    }