计算字符串中的最大数量

时间:2017-04-10 22:52:46

标签: java arrays string for-loop int

我正在尝试输出最高数字出现在用户输入中的次数,例如用户输入2 4 3 4 2 4 0最高数字是4,它出现3次,不知道如何去做。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner keyboard = new Scanner(System.in);

    String number, last;

    System.out.println("Enter an interger (0 ends the input): ");
    number = keyboard.nextLine();
    last = number.substring(number.length() - 1);

    while(!last.equals("0")){
        System.out.println("Must end the input with a 0: ");
        number = keyboard.nextLine();
        last = number.substring(number.length() - 1);
    }

    String[] array = number.split(" ");

    int max = Integer.MIN_VALUE, maxIndex = 0;

    int count;

    for (int i = 0; i < array.length; i++) {
         if (Integer.parseInt(array[i]) > max) {
             max = Integer.parseInt(array[i]);
             maxIndex = i;
         }
    }
    //String repeat = number.);
    System.out.println("The largest number is " + max);
}

2 个答案:

答案 0 :(得分:2)

您可以使用Java 8的流来实现,例如:

String number = "2 4 3 4 2 4 0";
String[] array = number.split(" ");
TreeMap<Integer,Long> numberMap = Arrays.stream(array)
    .map(s -> Integer.parseInt(s))
    .collect(Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting()));
System.out.println(numberMap.descendingMap().firstEntry().getValue());

这基本上将每个号码及其计数存储到Map。由于我们使用的MapTreeMap,它会按升序对键进行排序。然后我们从中获取最后一个(即最高)键并打印相应的值3。

答案 1 :(得分:1)

其他答案效率较低,因此我会显示suggested solution by David Wallace的代码:

  

嗯,基本逻辑很简单。对于字符串中的每个数字,有三种可能性。

     
      
  1. 它大于以前最大的数字 - 因此将其存储为最大数字,并将计数重置为1.
  2.   
  3. 它等于之前最大的数字 - 所以递增计数。
  4.   
  5. 它低于之前最大的数字 - 所以请忽略它。
  6.         

    您现在需要做的就是将其转换为Java。

所以这是:

int[] input = { 2, 4, 3, 4, 2, 4 };

int count = 0, max = 0;
for (int value : input) {
    if (count == 0 || value > max) {
        max = value;
        count = 1;
    } else if (value == max) {
        count++;
    }
}

System.out.printf("Highest number of %d was found %d times%n", max, count);

输出

Highest number of 4 was found 3 times

如果你想在很多地方做这件事,你可以编写自己的收藏家并使用Java 8 Streams。

以下是收藏家的使用:

int[] input = { 2, 4, 3, 4, 2, 4 };

Max max = Arrays.stream(input).collect(Max::new, Max::add, Max::merge);

System.out.printf("Highest number of %d was found %d times%n", max.getValue(), max.getCount());

这是收藏家本身:

public class Max {
    private int value;
    private int count;
    public void add(int newValue) {
        if (this.count == 0 || newValue > this.value) {
            this.value = newValue;
            this.count = 1;
        } else if (newValue == this.value) {
            this.count++;
        }
    }
    public void merge(Max other) {
        if (this.count == 0 || (other.count != 0 && other.value > this.value)) {
            this.value = other.value;
            this.count = other.count;
        } else if (other.value == this.value) {
            this.count += other.count;
        }
    }
    public int getValue() {
        return this.value;
    }
    public int getCount() {
        return this.count;
    }
}