2017-04-10 1 views
-1

예를 들어 사용자 입력과 같이 가장 높은 숫자가 사용자 입력에 나타나는 시간을 출력하려고합니다. 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); 
} 
+3

글쎄, 기본 논리는 간단하다. 문자열의 각 숫자에는 세 가지 가능성이 있습니다. (1) 이전에 가장 큰 수보다 큽니다. 따라서 가장 큰 수로 저장하고 수를 1로 재설정하십시오. (2) 이전에 가장 큰 수와 같습니다. 따라서 수를 증가시킵니다. (3) 이전에 가장 큰 숫자보다 적습니다. 따라서 무시하십시오. 이제 Java로 변환하면됩니다. –

답변

2

당신은 : 예컨대, 자바 (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.

+2

그 값은 모든 값의 수를 누적합니다. 이는 당면한 작업에 대해 과잉 인 것입니다. – Andreas

+0

@ darshan 고마워요. 나는 아직 배운 것이 없기 때문에 물어 보았습니다. – Angel

+0

그래, 이것은 나에게 설명 된 해결책보다 효율이 떨어지고 @Andreas가 게시했습니다. 이해하기가 훨씬 어렵습니다. –

1

다른 답변을 덜 효율적이며 해당 값을 출력, 그래서 나는 suggested solution by David Wallace에 대한 코드를 보여주지 :

음, 기본을 논리는 간단합니다. 문자열의 각 숫자에는 세 가지 가능성이 있습니다.

  1. 그것은 이전에 가장 큰 수보다 큰입니다 - 그래서 최대로 저장하고, 이전에 가장 많은 1.
  2. 그것은 동일한의로 카운트를 재설정 - 그래서 수를 증가.
  3. 이전의 최대 수치보다 적습니다. 무시하십시오.

이제 자바로 변환하면됩니다.

그래서 여기있다 :

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 

이 당신이 많은 장소에서하고 싶은 일이 있으면, 당신이 당신의 자신의 수집을 쓸 수 및 자바 8 스트림을 사용하십시오. 여기

는 콜렉터의 사용이다 : 여기

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; 
    } 
} 
+0

내가 이미 가지고있는 코드에 그것을 추가하려고 int 메신저로해야합니다. for 루프는 이미 최대 횟수를 얻을 수있는 모든 반복 횟수를 얻습니다. 내가 제공 한 번호는 하드 코드가 아닌 단지 예일뿐입니다. 미안하지만 저는 지난 주에 Java를 배우기 시작했습니다. 그래서 나는 일들이 어떻게 이루어지는 지 잘 알고 있지 않습니다. – Angel

+0

@Angel 귀하의 질문은 가장 높은 숫자의 발생에 관한 것이지 사용자로부터 그 숫자를 수집하는 것이 아닙니다. 따라서 카운트 로직을 표시하기 위해 * 예제 * 코드에서 배열 초기자를 사용하고 작동하는 것입니다. 'for' 루프가'int' 값이나'double' 값을 반복하는지,'String' 값을 반복하는지, 그리고 그것들을 번호 매기기로 파싱하는지에 관계없이 최대 값을 계산하는 로직과는 관련이 없습니다. – Andreas

관련 문제