1
votes

Impossible de faire changer le tableau pour qu'il soit de taille correcte

J'essaie donc de créer un nouveau tableau de longueur différente dans une méthode séparée en passant un tableau de la méthode principale mais j'ai des problèmes. Essentiellement, ce que j'essaie de faire est de faire en sorte que mes valeurs de tableau de départ de

   public static int [] createLowerArray(int maxParam, int [] myInchesParam) {
    int [] betterInches = {0,0,0,0,0,0,0,0,0,0};
    for (int i = 0; i < myInchesParam.length; i++) {
        if (myInchesParam[i] < maxParam) 
            betterInches[i] = myInchesParam[i];
    } 
    return betterInches;
}

soient transférées vers ma méthode createLowerArray, et en la comparant à l'entrée utilisateur maxParam, crée un nouveau tableau et retourne il.

 int [] myInches = {89,12,33,7,72,42,76,49,69,85,61,23};

Alors disons que l'utilisateur saisit "40", il verrait si les éléments correspondants dans myInches / myInchesParam étaient plus petits ou non, et s'ils l'étaient, remplaceraient le tableau J'ai créé dans cette méthode avec sa valeur correspondante. Ainsi, étant donné que 12, 33, 7 et 23 sont les seuls éléments inférieurs à 40, il devrait former un tableau de longueur 3 avec la position 0 étant 12, [1] = 12, [2] = 7 et [3] = 23 Je sais que vous ne pouvez pas rendre un tableau plus grand qu'il ne l'est déjà en raison de problèmes de mémoire, mais il est possible d'en réduire un à partir de ce qu'il est déjà, n'est-ce pas? Si ce n'est pas possible non plus, j'aimerais savoir comment obtenir ce résultat car au moment où le tableau qu'il renvoie est de la même longueur que l'original avec des positions d'élément incorrectes ce n'est pas ce que je souhaite faire. Merci d'avance pour toute aide.


2 commentaires

vous pouvez modifier la taille d'un tableau. Un nouveau doit être créé, en utilisant éventuellement certaines des méthodes de Arrays (par exemple copyOf () ). Ou plus facilement, utilisez un ArrayList pour créer une liste avec peut ensuite être converti en un tableau Encore mieux (IMO) en utilisant des flux ( Arrays.stream (...). Filter (...) .toArray () )


au lieu d'utiliser myInchesParam.length; dans la boucle for pourquoi n'utilisez-vous pas betterInches.length; ? ou vous pouvez utiliser la structure de données de liste.


3 Réponses :


1
votes

Pour ce faire, vous pouvez utiliser une liste.

Essayez ceci:

public static int [] createLowerArray(int maxParam, int [] myInchesParam) {
    List<Integer> betterInches= new ArrayList<Integer>();
    for (int i = 0; i < myInchesParam.length; i++) {
        if (myInchesParam[i] < maxParam) 
            betterInches.add(myInchesParam[i]);
    } 
    Integer[] returnedInches= betterInches.toArray();
    return returnedInches;
}


6 commentaires

pouvez-vous faire cela avec juste un tableau ??


@CommonMan, je pense qu'une liste était destinée à cela parce que: Sa taille est modifiée dynamiquement lorsque des éléments sont ajoutés.


obtenir un tableau à la fin semble mieux que votre précieuse version, j'apprécierais si vous pouviez ajouter une autre réponse dans la partie 2 avec juste nouveau tableau car cela réglerait la situation actuelle avec le besoin minimal d'importations.


@CommonMan vous êtes conscient que les importations ne coûtent pas, elles réduisent finalement la taille de votre source ... vous importez simplement l ' espace de noms , il n'y a aucune classe ou bibliothèque importée ou autre (vous éviter les importations en utilisant simplement des noms qualifiés complets partout {et en rendant le code plus difficile à lire }, la classe compilée résultat sera la même)


@CarlosHeuberger, Il n'y a aucun coût d'exécution lié à l'utilisation d'une instruction d'importation Le processus de compilation peut prendre un peu plus de temps avec une instruction d'importation Le processus de compilation peut prendre encore plus de temps avec une instruction d'importation générique Pour une meilleure lisibilité, les instructions d'importation génériques sont mauvaise pratique pour tout sauf les classes jetables La surcharge de compilation des instructions d'importation non génériques est mineure, mais elles offrent des avantages de lisibilité, la meilleure pratique est donc de les utiliser ref: javaperformancetuning.com/news/qotm031.shtml


Pour une raison quelconque, les deux dernières lignes me disent que ce sont des types incompatibles. L'avant-dernière ligne dit "java.lang.object ne peut pas être converti en java.lang.Integer" tandis que la dernière ligne dit "java.lang.Integer ne peut pas être converti en int []". Ai-je tapé une de trop de variables? Je l'ai tapé comme il a été écrit, si tout le reste échoue, je peux toujours essayer la méthode en boucle après tout.



2
votes

Vous ne pouvez pas modifier la longueur d'un tableau déjà créé. Cela signifie que vous ne pouvez pas augmenter ou diminuer la taille. Vous avez ici quelques options. Tout d'abord, vous pouvez utiliser une ArrayList . L'avantage d'utiliser des listes est qu'elles ont des fonctions intégrées qui vous permettent d'augmenter et de réduire la longueur de vos données.

L'autre option (qui ne nécessite pas de ArrayLists ) serait de ne pas créer le tableau tant que vous ne savez pas combien de temps (ou combien court) il doit être. Pour ce faire, vous pouvez écrire une boucle for qui compte le nombre d'éléments que vous souhaitez ajouter au nouveau tableau. Ensuite, après cette boucle, vous créez un tableau de cette longueur. Enfin, vous écrivez une deuxième deuxième boucle for qui ajoute les éléments au tableau nouvellement créé.


10 commentaires

pouvez-vous faire cela sans ArrayList ??


@CommonMan Oui. C'est la deuxième option que j'ai mentionnée.


@CarlosHeuberger, je sais que ArrayList simplifiera les choses en termes de réduction de la taille, mais si l'implémentation pouvait être faite avec un nouveau tableau ou similaire, cela réduirait le frais généraux des importations dans le programme.


ArrayList effectue l'implémentation du tableau sous le capot . Votre solution n'est pas fausse mais à quoi ça sert si je peux donner une autre réponse dans le stream java-8 maintenant, résoudra-t-il le problème ?? Oui, cela résoudra le problème et sera même efficace, mais cela n’éteint pas la solution, la solution demandée concernant Array uniquement, vous devez donc essayer d’obtenir la solution possible avec juste cela, si c’était possible , Oui, ça l'est.


Pensez, si quelqu'un vous a posé une question concernant le tri binaire et que vous, sans utiliser le tri binaire, donnez la réponse Collection.sort () , bien que ce ne soit pas faux mais ne remplisse pas le contexte.


@CommonMan C'est pourquoi j'ai inclus l'autre option, qui utilise uniquement des tableaux vanilla, et ne nécessite aucune importation supplémentaire.


Je l'ai lu maintenant @EKW, la deuxième édition semble bien. Juste un peu d'implantation de code en montrera plus.


en fait, la question portait sur la réduction de la taille d'un tableau, donc la bonne réponse est simplement "Non, la taille du tableau ne peut pas être modifiée"


@CarlosHeuberger C'est la première phrase de ma réponse.


Les choses s'échauffent, je vois, non mais je vous en remercie sérieusement. La pensée des listes ne m'a même pas traversé l'esprit et j'ai pensé que j'étais coincé avec des boucles. Je vais essayer la méthode en boucle que vous avez mentionnée car j'ai besoin de plus de pratique et si cela va vers le sud, je vais essayer les listes. Encore merci.



0
votes

Un tableau a par définition la taille que vous lui donnez lorsque vous l'initialisez. Malheureusement, vous ne pourrez pas modifier dynamiquement la taille du tableau. Ce que vous pouvez faire est de créer un nouveau tableau avec la taille appropriée ou d'essayer de travailler avec ArrayLists (ou n'importe quelle liste de même). En fonction du calcul de la taille de votre tableau, vous pouvez même calculer la taille avant de le créer, puis définir la taille correcte de votre tableau lors de l'initialisation.

Un exemple de création d'une ArrayList peut être trouvé ici .

ou comment @preciousbetine vous a suggéré de réécrire votre méthode en quelque chose comme ça (tout est écrit sans aucune bibliothèque supplémentaire)

public static int [] createLowerArray(int maxParam, int [] myInchesParam) {
        List<Integer> betterInches= new ArrayList<>();
        Arrays.stream(myInches)
            .forEach(inches -> {
                if (inches < maxParams) {
                    betterInches.add(inches);
                }
            });
        return betterInches.toArray();
    }


0 commentaires