我正在尝试编写一个打印出具有唯一绝对值的数字的程序。 这是我的尝试:
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所以它不是我主要关心的解决方案是优雅的,只需要它工作))任何人都可以解决一些错误,请吗?
答案 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语句是有意义的。 非常感谢所有回复我帖子的人。复活节快乐!