Comment puis-je inverser un tableau int en Java?
Je suis en train d'inverser un tableau int en Java.
Cette méthode ne permet pas d'inverser la matrice.
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;
}
Quel est le problème avec elle?
- Je vois ce que j'ai fait de mal. Devrait être validData.longueur/2. Sinon, il va s'inverser de l'onu,-de s'inverser.
- Voir en.wikipedia.org/wiki/In-place_algorithm, qui contient une description de la version correcte de cet algorithme.
- Java 8 : stackoverflow.com/a/46756353/1216775
Vous devez vous connecter pour publier un commentaire.
Pour inverser un tableau int, vous échangez des éléments jusqu'à ce que vous atteindre le point central, comme ceci:
La façon dont vous le faites, vous swap de chaque élément deux fois, de sorte que le résultat est le même que la liste initiale.
validData.length / 2
partie à l'extérieur de la boucle for.validData.length >> 1
. C'est l'équivalent, et plus rapide, mais il confond beaucoup de programmeurs et de toute bonne compilateur va automatiquement faire.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 de bug-sûr de coller avec facilement disponibles bibliothèques déjà de l'unité testée et utilisateur-testé quand ils prennent soin de votre problème.
int
s dans ce cas) sont enveloppés dans leurs wrappers (Integer
s dans ce cas) et de le mettre dans la liste. Vous voyez,Integer
s sont des objets. @Tomint[]
est différente deInteger[]
. Essayez-le:Integer[] array = new int[5]
. Vous obtiendrez une erreur de compilation. C'est pourquoi la JavaArrays
classe définit un ensemble de méthodes pour travailler avec des tableaux primitifs. En essayant 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 - mettre en place l'algorithme utilise moins de mémoire et s'exécute plus rapidement.Arrays.asList()
ne fait pas référence au tableau d'origine, ni le tableau retourné. C'est l'un des problèmes avec cette méthode: il utilise le triple de la mémoire et ne le triple du travail comme un algorithme sur place.Arrays.asList()
: en fait, il ne référence que le tableau d'origine. Donc, cela ne l'utilise deux fois plus de mémoire et de ne deux fois plus de travail (depuisList.toArray
génère un tout nouveau tableau). Un bon non-algorithme sur place serait encore utiliser deux fois plus de mémoire, mais faire la même quantité de travail que de la méthode. @Andrea, Vous avez raison. RessembleCollections.reverse(Arrays.asList(array))
est un moyen valable pour inverser une matrice. Malheureusement, cela ne fonctionne pas pour les primitives.int[]
comme argument à cette méthode ("incompatible types: int[] ne peut pas être converti à l'Objet[]").Je pense que c'est un peu plus facile de suivre la logique de l'algorithme si vous déclarez explicite des variables à suivre les indices qui changeant à chaque itération de la boucle.
Je pense aussi que c'est plus lisible pour ce faire, dans une boucle while.
java.util.Collections.reverse()
peut inverserjava.util.List
s etjava.util.Arrays.asList()
renvoie une liste qui encapsule la matrice spécifique que vous lui passez, doncyourArray
est inversée après l'invocation deCollections.reverse()
.Le coût est simplement la création d'une Liste d'objet et pas de bibliothèques supplémentaires sont nécessaires.
Une solution similaire a été présenté dans la réponse de Tarik et leurs présents, mais je pense que cette réponse serait plus concise et plus facilement analysables.
int[]
àasList(...)
ne sera pas de retour d'unList<Integer>
, mais unList<int[]>
, contenant un élément. Il est AFAICS pas de simples intégrés dans la façon de convertir unint[]
à unInteger[]
.Il y a déjà beaucoup de réponses ici, principalement axés sur la modification de la matrice en place. Mais par souci d'exhaustivité, voici une autre approche à l'aide de Java flux de préserver le tableau d'origine et de créer un nouveau inversée tableau:
Avec La Goyave:
asList
méthodes, il crée un affichage qui écrit directement par le biais de la sauvegarde (primitive) de tableau. Je pense que les électeurs ici, à tort, que cette retourné une boîte de liste ou de quelque chose.Collections.reverse
est une méthode void. Celle-ci s'opère en place sur une Goyave interne de la classe qui encapsule uneint[]
(Car il n'est jamais stocke une liste de la boîteInteger
s je ne qualifierais pas la classe d'un "boxed " liste", mais plutôt d'une "Liste de la vue d'un tableau"). Mais oui, il fonctionne via une interface en passantInteger
objets, donc, ce serait de créer beaucoup d'objet temporaire de désabonnement et de la boxe comme mentionné. Essayez unIntStream
ou une primitive de la collection de la bibliothèque pour le cas où la performance est importante. (Mine, Koloboke, Eclipse, Collections, ...)Ints
?Simple boucle for!
start <= end
àstart < end
Cela vous aidera à
C'est de cette façon, je serais personnellement le résoudre. La raison derrière la création de la paramétrées méthode est de permettre à n'importe quel tableau à trier... et pas seulement votre entiers.
J'espère que vous apportent quelque chose.
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
est juste un wrapper autour de la matrice, de sorte que le tableau d'origine est inversée.Votre programme de travail pour seulement
length = 0, 1
.Vous pouvez essayer :
Si vous travaillez avec des données qui ont le plus primitif (c'est à dire char, byte, int, etc), alors vous pouvez faire plaisir XOR opérations.
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
En cas de Java 8 nous pouvons également utiliser les flux d'inverser le tableau entier comme:
Il est plus efficace de simplement effectuer une itération de la matrice vers l'arrière.
Je ne suis pas sûr si Aaron solution de ce vi du présent appel
Collections.reverse(list);
personne Ne sait?Ne serait pas en le faisant de cette façon beaucoup plus rare pour les erreurs?
Solution à o(n) fois la complexité et o(1) l'espace de la complexité.
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.ci-dessous le programme complet dans votre machine.
Pour les programmes sur la matrice à l'aide de tableaux ce sera la bonne source.Passez par le lien.
À l'aide de la XOR solution pour éviter la variable temp votre code devrait ressembler à
Voir ce lien pour une meilleure explication:
http://betterexplained.com/articles/swap-two-variables-using-xor/
Ici est une simple mise en œuvre, à l'inverse de la matrice de de tout type, plus plein/partiel soutien.
Ici est l'Unité correspondante de Test
Voici ce que j'ai trouvé:
Il y a deux façons d'avoir une solution pour le problème:
1. Inverse d'une matrice dans l'espace.
L'étape 1. Permuter les éléments au début et à la fin de l'index.
L'étape 2. Incrémenter l'index de début décrémenter la fin de l'index.
L'étape 3. Itération de l'Étape 1 et l'Étape 2 jusqu'à la mise index < fin de l'index
Pour cela, la complexité temporelle O(n) et l'espace de complexité O(1)
Exemple de code pour inverser un tableau dans l'espace, c'est comme:
2. Inverse d'une matrice à l'aide d'un auxiliaire de tableau.
L'étape 1. Créer un nouveau tableau de taille égale à la matrice.
L'étape 2. L'insertion d'éléments pour le nouveau tableau à partir de l'index de début, de la
tableau donné, dès la fin de l'index.
Pour cela, la complexité temporelle O(n) et l'espace de complexité O(n)
Exemple de code pour inverser une matrice avec l'auxiliaire tableau est comme:
Aussi, nous pouvons utiliser les Collections de l'API de Java pour ce faire.
Les Collections de l'API utilise en interne les mêmes inverse dans l'espace de l'approche.
Exemple de code pour l'utilisation de l'API Collections est comme:
2 moyens pour inverser une Matrice .
À l'aide De la boucle et de permuter les éléments jusqu'à la mi-point avec le temps, la complexité de O(n/2).
}
À l'aide intégrée dans la fonction (Collections.reverse())
}
De sortie : [6, 5, 4, 3, 2, 1]
Ints
?Essayer ce programme en JAVA :-
Essayez ce code:
Voici une simple une solution rapide. Espérons que cela aide!.
Une autre façon d'inverser la matrice de
Que j'avais l'intention de garder mon Tableau original tel qu'il était, j'ai résolu ce problème de la manière suivante:
Donc, fondamentalement, de la boucle au travers de la table initiale et ajouter toutes les valeurs dans l'ordre inverse de la nouvelle (inversé) tableau. Le type de la liste peut être n'importe quoi.
Je travaille mon chemin à travers ce code plusieurs fois, ce qui provoque certaines autres solutions que de ne pas travailler.
Vous pouvez utiliser cette
Un simplement
i > 0
).