J'essaie d'inverser un tableau int en Java.
Cette méthode n'inverse pas le tableau.
for(int i = 0; i < validData.length; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
Qu'est-ce qui va pas avec ça?
Réponses:
Pour inverser un tableau int, vous permutez les éléments jusqu'à ce que vous atteigniez le milieu, comme ceci:
La façon dont vous le faites, vous permutez chaque élément deux fois, donc le résultat est le même que la liste initiale.
la source
validData.length / 2
partie à l'extérieur de la boucle for.validData.length >> 1
. C'est équivalent et plus rapide, mais cela confond de nombreux programmeurs et tout bon compilateur le fera automatiquement.validData.length - i - 1
et l'enregistrer dans une variable.Avec Commons.Lang , vous pouvez simplement utiliser
La plupart du temps, il est plus rapide et plus sûr de conserver les bogues avec des bibliothèques facilement disponibles déjà testées par les unités et testées par les utilisateurs lorsqu'elles prennent soin de votre problème.
la source
la source
int
s dans ce cas) sont enveloppées dans leurs wrappers respectifs (Integer
s dans ce cas) et placées dans la liste. Vous voyez,Integer
s sont des objets. @Tomint[]
différent deInteger[]
. Essayez:Integer[] array = new int[5]
. Vous obtiendrez une erreur de compilation. C'est pourquoi laArrays
classe Java définit un tas de méthodes pour travailler avec des tableaux primitifs. Essayer de passer unint[]
à la méthode ci-dessus se traduira par quelque chose commeThe method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
. @Filip - un algorithme sur place utilise moins de mémoire et s'exécute plus rapidement.Arrays.asList()
ne fait pas référence au tableau d'origine, pas plus que le tableau renvoyé. C'est l'un des problèmes de cette méthode: elle utilise le triple de la mémoire et triple le travail en tant qu'algorithme sur place.int[]
argument comme argument à cette méthode ( "les types incompatibles: int [] ne peuvent pas être convertis en Object []" ).java.util.Collections.reverse()
peut inverserjava.util.List
s etjava.util.Arrays.asList()
renvoie une liste qui encapsule le tableau spécifique que vous lui passez,yourArray
est donc inversé après l'invocation deCollections.reverse()
.Le coût n'est que la création d'un objet List et aucune bibliothèque supplémentaire n'est requise.
Une solution similaire a été présentée dans la réponse de Tarik et de ses commentateurs, mais je pense que cette réponse serait plus concise et plus facilement analysable.
la source
int[]
àasList(...)
ne renverra pas unList<Integer>
, mais unList<int[]>
contenant un élément. Il n'y a pas de moyen intégré AFAICS pour convertir unint[]
en unInteger[]
.Arrays.stream(arr).boxed().collect(Collectors.toList())
ouArrays.stream(arr).boxed().toArray(Integer[]::new)
Je pense qu'il est un peu plus facile de suivre la logique de l'algorithme si vous déclarez des variables explicites pour garder une trace des indices que vous permutez à chaque itération de la boucle.
Je pense également qu'il est plus lisible de le faire dans une boucle while.
la source
Il y a déjà beaucoup de réponses ici, principalement axées sur la modification du tableau sur place. Mais par souci d'exhaustivité, voici une autre approche utilisant des flux Java pour conserver le tableau d'origine et créer un nouveau tableau inversé:
la source
Avec la goyave:
la source
asList
méthodes, il crée une vue qui écrit directement dans le tableau de support (primitif). Je pense que l'électeur ici a pensé à tort que cela renvoyait une liste encadrée ou quelque chose.Collections.reverse
est une méthode nulle. Cela fonctionne sur place sur une classe interne de Guava qui encapsule unint[]
(Puisqu'il ne stocke jamais une liste deInteger
s en boîte, je n'appellerais pas la classe une "liste en boîte", mais plutôt une "Vue de liste d'un tableau"). Mais oui, il fonctionne via une interface passant desInteger
objets, donc cela créerait beaucoup de désabonnement temporaire et de boxe comme mentionné. Essayez uneIntStream
ou une bibliothèque de collections primitives pour savoir où les performances sont importantes. (Trove, Koloboke, Eclipse Collections, ...)Dans le cas de Java 8, nous pouvons également utiliser
IntStream
pour inverser le tableau d'entiers comme:la source
Simple pour boucle!
la source
start <= end
pourstart < end
Cela vous aidera
la source
la source
C'est ainsi que je le résoudrais personnellement. La raison derrière la création de la méthode paramétrée est de permettre à n'importe quel tableau d'être trié ... pas seulement vos entiers.
J'espère que vous en tirez quelque chose.
la source
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
est juste un wrapper autour du tableau, donc le tableau d'origine est inversé.Votre programme ne fonctionnera que pour
length = 0, 1
. Tu peux essayer :la source
Si vous travaillez avec des données plus primitives (c.-à-d. Char, byte, int, etc.), vous pouvez effectuer des opérations XOR amusantes.
la source
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
Il est plus efficace d'itérer simplement le tableau vers l'arrière.
Je ne sais pas si la solution d'Aaron fait cela via cet appel.
Collections.reverse(list);
Quelqu'un le sait-il?la source
la source
la source
Ne serait-il pas beaucoup plus improbable de le faire de cette façon pour des erreurs?
la source
Solution à complexité temporelle o (n) et complexité spatiale o (1).
la source
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.2 façons d'inverser un tableau.
Utilisation de la boucle For et échange les éléments jusqu'au milieu avec une complexité temporelle de O (n / 2).
}
Utilisation de la fonction intégrée (Collections.reverse ())
}
Sortie: [6, 5, 4, 3, 2, 1]
la source
Ints
?la source
Il y a quelques bonnes réponses ci-dessus, mais voici comment je l'ai fait:
la source
ci-dessous est le programme complet à exécuter sur votre machine.
Pour les programmes sur matrice utilisant des tableaux, ce sera la bonne source. Passez par le lien.
la source
Utilisation de la solution XOR pour éviter la variable temporaire à laquelle votre code devrait ressembler
Voir ce lien pour une meilleure explication:
http://betterexplained.com/articles/swap-two-variables-using-xor/
la source
la source
Voici une implémentation simple, pour inverser un tableau de tout type , plus un support complet / partiel .
Voici le test unitaire correspondant
la source
Voici ce que j'ai trouvé:
la source
Il existe deux façons d'avoir une solution au problème:
1. Inversez un tableau dans l'espace.
Étape 1. Échangez les éléments au début et à la fin de l'index.
Étape 2. Incrémentez l'index de début décrémentez l'index de fin.
Étape 3. Répétez les étapes 1 et 2 jusqu'à l'index de début <index de fin
Pour cela, la complexité temporelle sera O (n) et la complexité spatiale sera O (1)
Un exemple de code pour inverser un tableau dans l'espace est comme:
2. Inversez un tableau à l'aide d'un tableau auxiliaire.
Étape 1. Créez un nouveau tableau de taille égale au tableau donné.
Étape 2. Insérez des éléments dans le nouveau tableau à partir de l'index de début, du tableau donné à partir de l'index de fin.
Pour cela, la complexité temporelle sera O (n) et la complexité spatiale sera O (n)
Un exemple de code pour inverser un tableau avec un tableau auxiliaire est comme:
De plus, nous pouvons utiliser l'API Collections de Java pour ce faire.
L'API Collections utilise en interne la même approche inverse dans l'espace.
Voici un exemple de code d'utilisation de l'API Collections:
la source
la source
la source