【问题标题】:How to show maximum same adjacent elements in an array in Java如何在Java中的数组中显示最大相同的相邻元素
【发布时间】:2017-07-08 15:20:55
【问题描述】:

我是 Java 新手,我正在处理数组排序问题,但我遇到了这个问题。搜索了类似或重复的帖子,但似乎没有找到。

问题是“在一个数组中找到最相同的相邻元素并将它们写入一个新数组”。

我的问题是。 如何将出现次数最多的相邻元素存储在另一个数组中的数组中?

这就是我到目前为止所提出的。

int[] arr= {2, 1, 1, 3, 3, 2, 2, 2, 2, 1 ,1}; //test array

int counter=0;
int i = 0;
int length = arr.length;
int[] resultArr=new int[length];



for (i=1; i<length; i++)

    {
   if (arr[i-1]==arr[i])
    {
     counter++;      // Counter to represent maximal adjacent occurred elem.
     resultArr[i] = arr[i]  //Writing elements in result array
    }





} 
 System.out.println(counter);  
 System.out.println(resultArr);     

 Input: It is the test array "arr"

 Output 1 : Shoud be 4 representing the maximum of same adjacent elements ( i.e the 2's in the array )
 Output 2 : Must be an array that contains the 4 elements of the array ({2, 2, 2 ,2} )

我的输出是(直接来自控制台)

1
[我@6d06d69c

【问题讨论】:

  • 你有什么问题?为什么会输出“[I@6d06d69c”或其他内容?
  • 什么是最大计数器?您是否尝试过使用调试器逐行遍历代码并了解您做错了什么?
  • @JBNizet 提到使用调试器。学习使用调试器比输入和格式化帖子以及等待答案花费更少的精力
  • 听起来像 Homeworks :D,如果是这样,你必须尝试自己解决它
  • @EbrahimPoursadeqi 一点也不。一个月前,我的学期结束了。我这样做是为了我自己。我正在读一本书并解决它之后的问题。

标签: java arrays loops sorting


【解决方案1】:

分解问题,首先是确定相邻值的运行何时停止的方法;

private static int runsTo(int[] vals, int index) {
    for (int i = index; i < vals.length - 1; i++) {
        if (vals[i] != vals[i + 1]) {
            return i;
        }
    }
    return vals.length;
}

然后我们可以将它与Arrays.toString(int[])1 以及Arrays.copyOfRange(int[], int, int) like 一起使用

int[] arr = { 2, 1, 1, 3, 3, 2, 2, 2, 2, 1, 1 };
int index = 0, count = 0;
for (int i = 0; i < arr.length; i++) {
    int r = runsTo(arr, i);
    int c = r - i + 1;
    if (c > count) {
        index = i;
        count = c;
        i += count - 1;
    }
}
System.out.println(Arrays.toString(arr));
System.out.printf("Starting from %d get %d%n", index, count);
System.out.println(Arrays.toString(Arrays.copyOfRange(arr, index, index + count)));

哪些输出

[2, 1, 1, 3, 3, 2, 2, 2, 2, 1, 1]
Starting from 5 get 4
[2, 2, 2, 2]

1 Java 数组不会覆盖 toString(),因此您将获得数组的哈希码。

【讨论】:

  • 巧合,但在书中我发现了问题,建议以类似的方式使用两个变量作为最大值,当前索引在哪里。谢谢你。完美运行。
【解决方案2】:

您在代码中犯了两个错误,首先您对输入数组arr 和结果数组resultArr 使用相同的索引i,您应该像这样为resultArr 使用不同的索引

int resultArrIndex = 0;
for (i=1; i<length; i++)
{
  if (arr[i-1]==arr[i])
  {
    counter++;      // Counter to represent maximal adjacent occurred elem.
    resultArr[resultArrIndex] = arr[i]  //Writing elements in result array
    resultArrIndex++;
  }
} 

其次,这不是打印数组的方法,您可以像这样在for 循环中执行此操作

for (int i = 0; i < resultArr.length; i++) {
  System.out.println(resultArr[i]);  // will print each in a line
}

或者像这样

System.out.println(Arrays.toString(resultArr));  // Print all in one line

【讨论】:

  • 哦,我知道我的输出是堆栈内存中数组的地址吗?
  • @VeselinLalov 它打印一个描述数组标识的字符串,在这种情况下是内存位置,而不是数组内容,请在此处查看更多信息stackoverflow.com/questions/8410294/…
【解决方案3】:

这是你的解决方案:

package com.sujit;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Test {
    public static int count = 0;
    public static void main(String[] args) {
        Integer[] arr= {2, 1, 1, 3, 3, 2, 2, 2, 2, 1 ,1}; //test array
        List<Integer> resultList =Arrays.asList(arr);
        List<Integer> maxOccurence = new ArrayList<Integer>();
        Set<Integer> set = new HashSet<>();

        for (Integer integer : resultList) {
            set.add(integer);
        }
        for (Integer integer : set) {
            int freq = Collections.frequency(resultList, integer);
            maxOccurence.add(freq);
            System.out.println("Element : "+integer+"  Occurences= "+freq);
        }
        System.out.println(Collections.max(maxOccurence));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多