Java podstawy. Czy można to zapisać w krótszy sposób?

0

Witam proszę o pomoc i sprawdzenie czy jest możliwość napisania w krótszy sposób.
Program ma odszukać najmniejszą i największą wartość tablicy.

public static void main(String[] args) {

    int t[] = {21, 5, 9, 133, 355, 11, 324, 758};

    int min = Integer.MAX_VALUE;
    int max = Integer.MIN_VALUE;

    for(int i : t) {
        if (i < min && i>max) {
            min = i;
        }
            for (int el : t) {
                if (el > max) {
                max = el;
            }
        }
    }
    System.out.println(min);
    System.out.println(max);
}
0

Możesz np. posortować tablicę i wypisać pierwszy i ostatni element.
Ale to nie jedyne możliwe rozwiązanie.

To będą z 4 linijki.

Deklaracja tablicy.
Sortowanie tablicy.
Print pierwszy element.
Print ostatni element.

1

@sobota87:
A ten twój program w ogóle poprawnie działa?

if (i < min && i>max)
Jak liczba ma być mniejsza od minimum i większa od maksimum jednocześnie?

Po co robić fora w forze (tzn zagnieżdżać fory), jeśli wystarczy jedno liniowe przejście po tablicy?

Piszesz w notatniku? Formatowanie jest kompletnie z czapy.

0

Po skorzystaniu z Arrays i streamów (w standardzie javay) możesz napisać tak:

import java.util.Arrays;

public class Szukamy {
    public static void main(String[] args) {
        int t[] = {21, 5, 9, 133, 355, 11, 324, 758};
        Arrays.stream(t).max().ifPresent( val -> {
            System.out.println("max to:"+val);
        });
        Arrays.stream(t).min().ifPresent( val -> {
            System.out.println("min to:"+val);
        });
    }
}

0
import java.util.*;
 public static void main(String[] args) {
        int[] t = {21,5,9,133,355,11,324,758};
        List<Integer> list = new ArrayList<>();
        for(int i : t){
            list.add(i);
        }
        System.out.println(Collections.max(list));
        System.out.println(Collections.min(list));
    }
1

Wygrałem !!! (EDIT: wygrał jednak reptile333)

public static void main(String[] args) {
    int[] t = {21,5,9,133,355,11,324,758};
    List<Integer> list = Arrays.asList(ArrayUtil.toObject(t));
    System.out.println(Collections.max(list));
    System.out.println(Collections.min(list));
}
1

Jakbym robił to ja to zrobiłbym to tak:

        int t[] = {21, 5, 9, 133, 355, 11, 324, 758};
        int min = t[0];
        int max = t[0];
    
        for(int i : t) {
        
            if (i<min) {
                min = i;
            }
        
            if (i>max) {
                max = i;
            }
            
        }
    
        System.out.println(min);
        System.out.println(max);
5
public static void main(String args[])
{
    int[] t = {21,5,9,133,355,11,324,758};
    IntSummaryStatistics stats = Arrays.stream(t).summaryStatistics();        
    System.out.println(stats.getMin());        
    System.out.println(stats.getMax());
}
0

@jarekr000000 zrobił najkrócej, tylko zbyt bezpiecznie. Po skompresowaniu:

public static void main(String args[])
{
    int[] t = {21,5,9,133,355,11,324,758};
    System.out.println(Arrays.stream(t).min().getAsInt());
    System.out.println(Arrays.stream(t).max().getAsInt());
}

Mnie się tak podoba. Jedna krótka linia na min, jedna na max. Pustej tablicy nie dopuszczam, rzucam wyjątkiem.

0

Dwie fajne wersje już były - @juniorjavadev i @reptile333.

Na wypadek gdyby FP i wielowątkowość nie były priorytetem i chodziło by o coś więcej niż inty można jeszcze wykorzystać side effects:

	private static int[] findMinMax(int arr[]) {
	  int result[] = {Integer.MAX_VALUE, Integer.MIN_VALUE};
	  
	  Arrays.stream(arr).forEach(num -> {
	  	  result[0] = Math.min(num, result[0]); 
	  	  result[1] = Math.max(num, result[1]);
	    }
	  );
	  
      return result;	  
    }

http://ideone.com/urwJN3

Inna wersja jednoprzebiegowa (ale długa):
https://stackoverflow.com/a/41818375

1 użytkowników online, w tym zalogowanych: 0, gości: 1