J'étais chargé de trouver le mode d'une matrice donnée (longueur non spécifiée). Le mode est défini comme le numéro qui survient le plus unique em>. Ainsi, par exemple, le mode d'un tableau [1.0, 2.0, 3.0, 2.0] est 2.0. Toutefois, s'il n'y a pas de numéro unique de cette valeur, par exemple, [1.0, 2.0, 2.0, 3.0, 3.0], le programme renvoie "aucun mode" ou "double.nan" dans mon programme. J'ai un code écrit qui fonctionne pour 3/4 cas de test, mais fait toujours des gênes pour attraper le cas où il y a deux modes identiques. p> pour ce boîtier de test: p> Je m'attends à "nan", mais cela revient 4. Cependant, cela fonctionne pour Le cas ci-dessous: p> La sortie attendue est de 88,9, que le programme génère correctement. p> p>
5 Réponses :
Depuis que j'étais d'humeur à un petit défi, j'ai écrit ma propre solution en utilisant une carte pour compter les valeurs individuelles.
Ensuite, vous récupérez le nombre le plus élevé disponible et à nouveau sur la carte pour déterminer si plusieurs entrées ont le même nombre le plus élevé, si oui, vous retournerez NAN. P>
Expected NaN - and was: NaN Expected 88.90 - and was: 88.9
Elle ne peut pas utiliser l'API des collections.
Bien qu'elle a confirmé cela? Je pensais que seules les fonctions de tableau sont affectées ...
J'aime la façon dont cela fonctionne! Tant de nettoyant. Y aurait-il un moyen de le faire sans les collections?
Ouais. ... Je vais faire ce que tu as fait aussi bien qu'elles commencent à nouveau
@ maio290 Malheureusement oui. :(
C'est pourquoi j'ai eu tellement de mal à essayer de trouver une solution similaire sur le forum déjà - il existe des solutions formidables mais pas tout à fait pour les contraintes que j'ai.
Bien que d'autres personnes ont eu un peu de temps hier. Mais vraiment, votre école est un peu étrange. : /
là, vous n'agissez pas collection code> etc ... Programmation pure dure :) public double mode(double[] data)
{
if(data.length==1)
return data[0];
double temp;
double [] fr = new double [data.length]; //store frequency
int visited = -1;
for(int i = 0; i < data.length; i++)
{
int count = 1;
for(int j = i+1; j < data.length; j++)
{
if(data[i] == data[j])
{
count++;
fr[j] = visited;
}
}
if(fr[i] != visited)
fr[i] = count;
}
for (int i = 0; i < fr.length; i++) // sort array in decreasing order
{
for (int j = i + 1; j < fr.length; j++)
{
if (fr[i] < fr[j])
{
temp = data[i];
data[i] = data[j];
data[j] = temp;
temp = fr[i];
fr[i] = fr[j];
fr[j] = temp;
}
}
}
if(fr[0] == fr[1])
return Double.NaN;
else
return data[0];
}
Ce si utile !! La façon dont vous avez écrites les déclarations de retour est tellement plus propre et plus simple. L'idée de stocker une fréquence ne m'a pas eue eue, mais cela aide tellement. Merci!!
Maintenant, vous pouvez changer d'école hahaha ... laissez-moi vous dire que les écoles sont de même partout ... c'est vous qui devez comprendre le problème .. C'est ce qui vous fait un programmeur .. Heureux codage :)
Aussi difficile que cela, cela m'aide vraiment i> solidifier les concepts de base pour une base de programmation ... Merci encore! :)
Alors je me suis senti aussi contesté et obtenu une solution sans l'utilisation de Collection code> s.
Pas une solution vraiment belle mais il semble fonctionner:
Eh bien, ça fait le but, mais son très complexe ... vous pouvez voir ma réponse, conservée aussi courte que possible, dans la limite de la programmation dure Ponly API
Oooh je n'ai même pas envisagé l'option de tableau vide. L'option rencontrée avant également augmente l'efficacité que j'aime. Merci tellement tellement !! :)
Ajouter une autre alternative et parce que je me suis également senti aussi contesté:
L'idée générale est de générer une matrice de fréquence, avant l'exemple donné ci-dessus, au-dessus de p> qui indique combien de fois l'élément au même index est dans l'entrée, puis trouvez la valeur max dans la matrice de fréquence et vérifiez enfin si toutes les valeurs avec la même fréquence sont égales. P> public static double mode(double [] data) {
if(data == null || data.length < 1){
return Double.NaN;
}
int [] freq = new int [data.length];
for(int i = 0; i<data.length; i++){
for(int j = 0; j<data.length; j++){
if(data[i]==data[j]){
freq[i]++;
}
}
}
int max = 0;
double mode = data[0];
for(int i = 0; i<freq.length; i++){
if(freq[i]>max){
max = freq[i];
mode = data[i];
}
}
for(int i = 0; i<freq.length; i++){
if(freq[i] == max){
if(mode != data[i]){
return Double.NaN;
}
}
}
return mode;
}
Voici une approche à l'aide de l'API en continu. Cependant, j'ai pris la définition des modes qui est un ensemble plutôt qu'un nombre unique.
import org.junit.Test;
import java.util.Arrays;
import java.util.Map;
import java.util.OptionalLong;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
public class ModeTest {
private <T extends Number> Set<T> modes(T... input) {
return modes(Arrays.stream(input));
}
/**
* Calculate the modes of a numeric stream. The modes are the values that occurs most often. If no number in the
* stream is repeated, then all the numbers in the stream are modes.
*
* @param input stream of numbers
* @param <T> number type
* @return modes.
*/
private <T extends Number> Set<T> modes(Stream<T> input) {
// transform the input to a map containing the counted entries
final Set<Map.Entry<T, Long>> countedEntries = input
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet();
// Figure out the max value
final OptionalLong max = countedEntries
.parallelStream()
.mapToLong(Map.Entry::getValue)
.max();
// Handle the case where the stream was empty
if (max.isEmpty()) {
return Set.of();
}
return countedEntries
.parallelStream()
.filter(e -> e.getValue() == max.getAsLong())
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
}
@Test
public void oneMode() {
final Double[] input = new Double[]{1.0, 1.1, 1.2, 2.0, 2.0, 3.0};
assertEquals(modes(input), Set.of(2.0));
}
@Test
public void multipleModes() {
final Stream<Double> input = Stream.of(1.0, 1.1, 1.2, 2.0, 2.0, 3.0, 3.0);
assertEquals(modes(input), Set.of(2.0, 3.0));
}
@Test
public void allSingles() {
final Stream<Double> input = Stream.of(1.0, 1.1, 1.2, 2.0, 3.0);
assertEquals(modes(input), Set.of(1.0, 1.1, 1.2, 2.0, 3.0));
}
@Test
public void largeRandomSet() {
Integer[] randoms = new Integer[204800];
for (int i = randoms.length - 1; i >= 0; --i) {
randoms[i] = ThreadLocalRandom.current().nextInt(200);
}
assertFalse(modes(randoms).isEmpty());
}
@Test
public void emptyStream() {
final Stream<Double> input = Stream.of();
assertEquals(modes(input), Set.of());
}
}
la plus unique i> signifie le plus fréquemment i>?
Oui - le plus fréquemment, mais aussi, il ne devrait pas y avoir une autre valeur dans ce tableau avec le même mode. Si ça a du sens. Donc, [1.0,1.0,2.0,2.0,3,0] n'a pas de mode, car les 1,0 et 2,0 se produisent les mêmes fois.
Ne pouviez-vous pas simplement numériser le tableau et enregistrer la fréquence de chaque numéro rencontré dans une liste. Commandez ensuite la liste sur la fréquence décroissante. Si cette liste a plus d'un élément et que les 2 premiers éléments ont la même fréquence, puis renvoyez Nan. Sinon, renvoyez le premier élément de la liste.
@Robertkock Oui c'est ce que je pensais ... OP le fait de manière très complexe
Devrait probablement aller avec une carte et analyser une fois, incrémentation de la valeur chaque fois que la touche apparaît dans votre ensemble de données.
Comment puis-je déterminer la fréquence? Ceci est pour un projet scolaire, nous ne sommes donc pas autorisés à utiliser des méthodes de réseau. Seules les fonctions de base. Serais-je juste compter la fréquence en utilisant une boucle? Et simplifier simplement les cas dans mon code? @Robertkock
Gotta aime les projets scolaires qui vous donnent un outil multi-outil complexe pour apprendre et vous dire la seule façon de l'utiliser, c'est comme un marteau: p
Vous n'êtes même pas autorisé à utiliser
collection code> s?Vous pouvez trouver "Fréquence" dans un
for-boucle code> simlpe @francesBrown@ Benson99 exactement !! Nous avons eu un énorme projet avec 400 lignes de code, car ils ne nous ont pas permis d'utiliser plusieurs classes et programmation orientée objet.
Nope :( @robertkock
Qu'en est-il de la change d'école?
hahahhahahahahahahahaha ... @Robertkock tu m'as eu ...;)
Et sérieusement ... je suis allé là-bas. Je suis allé au doyen parce que j'ai payé 12k pour aller à l'école et nous avons perdu 3 semaines en utilisant en utilisant des méthodes de programmation à partir du début des années 90.
Hahahahaha c'est trop bon @robertkock
@ Benson99 oui !! S'il y a un moyen plus efficace de faire des choses, permet de sauvegarder le stress et l'heure et l'utiliser! sa 2019!