Nejste přihlášen/a.
Dobrý den,
chtěl bych se zeptat, jakým způsobem by to šlo v Javě řešit bez použití pole? Nejsem si jistý, jestli to zadání chápu, má se udělat for cyklus, který bude tvořit tu řadu a pak zjistit, jestli se tam nějaké číslo neopakuje? ... to ale nejde bez pole, že? a když to bude for cyklem, tak se tam opakovat nebudou nebo se mají zadávat na vstupu od uživatele, ale to bych zase musel mít 100 proměných k porovnávání, ne?
zadání: ctrlv.cz/...
Mimochodem, jak probíhaly hodiny programování u Vás, my dostanem zadání, většinou nikdo nic nevymyslí, občas dostanem řešení a jde se dál :/ Většinou dostáváme úlohy matematický nebo nějak změřený na logiku, takže nikdo neví :D Myslíte, že se takhle dá něco naučit a jak jste se to učili vy, taky na takových úlohách?
Děkuji za radu.
PS. Takhle jsem to udělal v tom poli: http://ctrlv.cz/QdTF
Dobrý den, děkuji za rady, jdu to opravit Je divné, že jsme dostali úkol na pole, které jsme ještě neuměli, aspoň jsem se ho naučil: :D Já myslím, že ta škola je zaměřená na IT a na elektrotechniku a strojírenství.
Jako nějaké řešení se třeba vymyslí, ale není úplně optimální, i když je dobře. Třeba: měli jsme udělat program, který bude převracet číslo (vstup - 321 => výstup 123) já jsem udělal tohle, což je sice funkční, ale oproti tomu správnému řešení je o dost složitější a řekl bych, že i pomalejší. moje: ctrlv.cz/... a správné řešení: ctrlv.cz/...
Ještě jednou děkuji za pomoc
Me prijde ze delate neco jineho nez je v zadani. Jsou nejaka cisla, nerika se odkud se vezmou, tudiz bych je klidne hardcodoval a nenacital je z klavesnice. A ma se zjistit jestli se nejake cislo se opakuje. Ani neni uvedeno ze to opakujici se cislo se ma vypsat (pokud by bylo nutne, asi bych to upravil na pouziti Collectos.groupingBy).
Treba neco takoveho:
------------------------------------------------------------
import java.util.stream.IntStream;
public class DuplicatedNumbersDemo {
public static void main(String[] args) {
System.out.println("duplicated number found?: " + (isAnyNumberDuplicated());
System.out.println("duplicated number found?: " + (isAnyNumberDuplicated(1,2,3));
System.out.println("duplicated number found?: " + (isAnyNumberDuplicated(1,2,3,4,4,5));
}
private static boolean isAnyNumberDuplicated(int... numbers) {
long countOfDintinctNumbers = IntStream.of(numbers)
.distinct()
.count();
return !(numbers.length == countOfDintinctNumbers);
}
}
-------------------------------------------
Vystup:
duplicated number found?: false
duplicated number found?: false
duplicated number found?: true
Pole sice použít nesmíte, ale o použití množiny neboli HashSetu není žádná zmínka. Tudíž lze toho využít. Set je takový objekt, funguje de facto jako pole, ale každá hodnota v něm může být právě jen jednou. Takže i kdybych se pokusil do množiny dát 50x číslo "1", bude mít množina délku 1 a obsahovat jediný prvek a to číslo "1".
Pokud tedy stačí jen odpověď, že na vstupu je nějaký duplikát, ale není třeba vědět jaký, pak množina naprosto stačí. Nechám zapsat všechny hodnoty ze vstupu do množiny a pak jen porovnám délku vstupního pole a množiny. Pokud budou různé, tak množina zahodila nějaký duplikát a je jasné, že tam nějaký musel být, pokud bude množina stejně velká jako vstupní pole, pak všechny hodnoty musely být unikátní. Samozřejmě mohl jsem tam přidat validaci, že pole nad 100 prvků vyhodí výjimku nebo vypíše do konzole chybovou hlášku.
------------------------------------------
public static void main(String[] args) {
int[] test = {0, 1, 1, 3, 4};
if (containsDuplicate(test)) {
System.out.println("Pole obsahuje duplikáty");
} else {
System.out.println("Pole NEOBSAHUJE duplikáty");
}
}
public static boolean containsDuplicate(int[] inputArray) {
Set uniqueNumbers = new HashSet();
for (int i = 0; i < inputArray.length; i++) {
uniqueNumbers.add(inputArray[i]);
}
if (uniqueNumbers.size() == inputArray.length) {
return false;
} else {
return true;
}
}
------------------------------------------
Výstup: Pole obsahuje duplikáty
------------------------------------------
Pokud je cílem udělat kompletní výpis výskytů, pak je vhodné řešení HashMap
public static void main(String[] args) {
int[] test = {0, 1, 1, 3, 4};
Map<Integer,Integer> occurenciesList = countOccurencies(test);
for (Map.Entry<Integer, Integer> entry : occurenciesList.entrySet()) {
Integer number = entry.getKey();
Integer occurencies = entry.getValue();
System.out.println("Číslo " + number + " se vyskytuje v poli celkem: " + occurencies + "x");
}
}
public static Map<Integer, Integer> countOccurencies(int[] inputArray) {
Map<Integer, Integer> occurencies = new HashMap<>();
for (int i = 0; i < inputArray.length; i++) {
if (occurencies.containsKey(inputArray[i])) {
occurencies.put(inputArray[i], occurencies.get(inputArray[i]) + 1);
} else {
occurencies.put(inputArray[i], 1);
}
}
return occurencies;
}
------------------------------------------
Výstup:
Číslo 0 se vyskytuje v poli celkem: 1x
Číslo 1 se vyskytuje v poli celkem: 2x
Číslo 3 se vyskytuje v poli celkem: 1x
Číslo 4 se vyskytuje v poli celkem: 1x
Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.
Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.