【问题标题】:How can I make an array without one number of the other array?如何在没有其他数组的一个数字的情况下制作一个数组?
【发布时间】:2015-10-18 09:09:15
【问题描述】:

我正在尝试用两个数组编写代码。第二个数组具有与第一个相同的值,除了最小的数字。我已经编写了一个代码,其中 z 是最小的数字。现在我只想制作一个没有 z 的新数组,任何反馈都将不胜感激。

public static int Second_Tiny() {
    int[] ar = {19, 1, 17, 17, -2};
    int i;
    int z = ar[0];

    for (i = 1; i < ar.length; i++) {
        if (z >ar[i]) {  
            z=ar[i];  
        }                   
    }
}

【问题讨论】:

  • 我正在尝试删除代码本身中的最小元素。我可以做些什么来删除变量 z 吗?
  • 您是否想以不同的方式执行此代码正在执行的操作,即不使用 z 或其他方式?为什么方法叫Second_Tiny
  • 我试图找出数组 ar[] 中第二小的整数。完成后我应该得到 1 的输出。我想要实现的方法是创建一个名为 newar[] 的新数组,并使其包含 ar[] 的所有索引,除了没有 -2。
  • 只需创建一个新数组,如int[] newArray = new int [ ar.length - 1 ];。现在只需将所有值从ar 复制到此数组中,最小值除外。
  • ArrayUtils.remove(ar[1], z);

标签: java arrays


【解决方案1】:

Java 8 流具有内置功能,可以实现您想要的。

public static void main(String[] args) throws Exception {
    int[] ar = {19, 1, 17, 17, -2, -2, -2, -2, 5};

    // Find the smallest number
    int min = Arrays.stream(ar)
            .min()
            .getAsInt();

    // Make a new array without the smallest number
    int[] newAr = Arrays
            .stream(ar)
            .filter(a -> a > min)
            .toArray();

    // Display the new array
    System.out.println(Arrays.toString(newAr));
}

结果:

[19, 1, 17, 17, 5]

否则,您会看到如下内容:

public static void main(String[] args) throws Exception {
    int[] ar = {19, 1, 17, 17, -2, -2, -2, -2, 5};

    // Find the smallest number
    // Count how many times the min number appears
    int min = ar[0];
    int minCount = 0;
    for (int a : ar) {
        if (minCount == 0 || a < min) {
            min = a;
            minCount = 1;
        } else if (a == min) {
            minCount++;
        }
    }

    // Make a new array without the smallest number
    int[] newAr = new int[ar.length - minCount];
    int newIndex = 0;
    for (int a : ar) {
        if (a != min) {
            newAr[newIndex] = a;
            newIndex++;
        }
    }

    // Display the new array
    System.out.println(Arrays.toString(newAr));
}

结果:

[19, 1, 17, 17, 5]

【讨论】:

  • 请注意,如果最小的数字重复多次,在流解决方案中您将删除它的所有实例,但普通解决方案将在数组末尾留下零(这对我来说似乎不正确)。尽管 OP 是否想要处理这种情况,但问题尚不清楚。
  • @TagirValeev 即使 OP 不想处理这种情况,我也更新了简单的解决方案以删除最小数量的所有实例。
  • 您可以使用 int min=0,minCount=0; for(int a:ar) if(minCount==0 || a&lt;min) {min=a;minCount=1;} else if(a==min) minCount++; 之类的方式将第一遍和第二遍合并在一起
【解决方案2】:

看到他的评论,我认为 OP 走错了路:

"我试图找出数组 ar[] 中第二小的整数。我 完成后应该得到 1 的输出。我想要达到的方式 即通过创建一个名为 newar[] 的新数组并使其包含所有 ar[] 的索引,除非没有 -2。"

这是解决此问题的一种非常低效的方法。您必须进行 3 次遍历,一次找到最小的索引元素,另一次遍历删除元素(这是一个数组,因此删除元素需要完整遍历),另一次再次找到最小的元素。

你应该只做一个单遍算法并跟踪最小的两个整数, 甚至更好地使用树来提高效率。以下是这个问题的最佳答案:

Find the 2nd largest element in an array with minimum number of comparisons

Algorithm: Find index of 2nd smallest element from an unknown array

更新:这是符合 OP 要求的算法, 3 次通过,没有外部库:

public static int Second_Tiny() {

  int[] ar = {19, 1, 17, 17, -2};

  //1st pass - find the smallest item on original array  
  int i;
  int z = ar[0];
  for (i = 1; i < ar.length; i++) {
    if (z >ar[i]){
      z=ar[i];
    }
  }

  //2nd pass copy all items except smallest one to 2nd array
  int[] ar2 = new int[ar.length-1];
  int curIndex = 0;
  for (i=0; i<ar.length; i++) {
    if (ar[i]==z)
      continue;
    ar2[curIndex++] = ar[i];
  }

  //3rd pass - find the smallest item again
  z = ar2[0];
  for (i = 1; i < ar2.length; i++) {
    if (z >ar2[i]){
      z=ar2[i];
    }
  }

  return z;
}

【讨论】:

  • 谢谢你的回答,但即使我做了低效的方法,也就是三遍;我该怎么做?
【解决方案3】:

这会获取变量 z 中指定元素的索引,然后将第二个数组设置为第一个数组减去那个元素。

基本上这给出了 ar2 = ar1 减去元素 z

public static int Second_Tiny() {
    int[] ar = {19, 1, 17, 17, -2};
    int[] ar2;
    int i;
    int z = ar[0];
    int x = 0;

    for (i = 1; i < ar.length; i++) {
        if (z >ar[i]){  
            z=ar[i];
            x=i;  
        }                   
    }
    ar2 = ArrayUtils.remove(ar, x);
    return(z);    
}

【讨论】:

  • 这样,如果负数 2 不是元素 4,则代码​​将不起作用。有没有我可以做到而不必担心订单?
  • 无论顺序如何,这都应该可以正常工作,除非您为“Z”输入的值不是您想要提取的值。 “X”变量只是获取任何变量“Z”设置的索引。我建议输出“Z”和元素或“ar2”,这样您就可以看到它们实际包含的内容。 :)
猜你喜欢
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 2016-07-12
  • 2022-01-14
  • 2019-03-03
  • 2021-02-23
相关资源
最近更新 更多