Wątek przeniesiony 2016-10-02 07:21 z Java przez bogdans.

Program na przednajwiększą liczbę

0

Witam! Mój program miał działać następująco: w jednym wierszu wpisujemy liczby, a następnie program zwraca przednajwiększą z nich. Czy ktoś mi podpowie co źle zrobiłem? (W eclipsie po wpisaniu liczb nic się nie dzieje :/)

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Program {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("Podaj liczby: ");
		String allNumbers = sc.nextLine();
		sc.close();
		List<String> numbers = new ArrayList<>();
		numbers = Arrays.asList(allNumbers.split("\\w"));
		System.out.println(highestButOne(numbers));
	}

	public static String highestButOne(List<String> list) {
		Collections.sort(list);
		Collections.reverse(list);
		return list.get(1);
	}
}
1

Proste:

  1. allNumbers.split("\w")) - a tak naprawde chciałeś tam "\s"
    Wyciągnąłeś wszystko co nie jest słowami, zamiast wszystko co nie jest spacjami. I dostałeś liste spacji i enterów.
    Która posortowałeś (program tak naprawdę wyświetlił coś - pewnie spację).
  2. Sortujesz liczby jako Stringi więc takie 100 jest mniejsze niż 11 - pewnie nie tego chciałeś.
    Potrzebujesz przekonwertować - List<Integer> indeedNumbers = numbers.map( Integer::parseInt)
0
  1. Nigdy nie zamykaj Scannera czytającego z klawiatury.
  2. Jeśli użytkownik wpisze liczby 5,3,5, to którą należy uznać za przednajwiększą 3 czy 5?
0
  1. Sortujesz liczby jako Stringi więc takie 100 jest mniejsze niż 11 - pewnie nie tego chciałeś.
    Potrzebujesz przekonwertować - List<integer> indeedNumbers = numbers.map( Integer::parseInt)

Kompilator pokazuje mi coś takiego : The method map(Integer::parseInt) is undefined for the type List<String>.

  1. Jeśli użytkownik wpisze liczby 5,3,5, to którą należy uznać za przednajwiększą 3 czy 5?

Tym się miałem jeszcze zająć, ale dzięki :D

0

tym się miałem jeszcze zająć, ale dzięki

Tym się powinieneś zająć już teraz. W zależności od decyzji, powinieneś gromadzić odczytane liczby w kolekcji typu List, albo w kolekcji typu Set.

0

A w jaki sposób miałbym zwrócić przedostatni element z Set'a?

Aktualnie zrobiłem coś takiego:

public static Integer highestButOne(List<Integer> list) {
		Collections.sort(list);
		Collections.reverse(list);
		int i;
		if(list.size()==2)
			return list.get(1);
		else {
		for(i=0; i<list.size()-1; i++) {
			if( list.get(i) != list.get(i+1) ) {
				return list.get(i+1);
			}
				
		}
		}
		return list.get(1);
	}
0

A w jaki sposób miałbym zwrócić przedostatni element z Set'a?

Wpierw przepisać Seta do listy.
Powyższa metoda zadziała źle, jeśli lista zawiera tylko jedną liczbę lub wszystkie liczby z listy mają taką samą wartość .

0
Selethen napisał(a):

Kompilator pokazuje mi coś takiego : The method map(Integer::parseInt) is undefined for the type List<String>.

To pewnie nie masz Javy 8 - w takim razie miej Jave 8.

Oczywiście, źle Ci napisałem!!! Przyzwyczaiłem się do Javaslang (polecam ).
A gołej javie 8 pisz tak:

numbers = Arrays.asList(allNumbers.split("\s")).stream().map(Integer::parseInt).collect(Collectors.toList());

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