Conversion d'un tableau int en un tableau String
J'ai donc cette "liste" d'ints. Il pourrait s'agir d'une Vector
, int[]
, List<Integer>
, peu importe.
Mon objectif est cependant de trier les ints et d’obtenir un String[]
. Comment la matrice int commence comme elle est en l'air.
ex: .__ Commencez par: {5,1,2,11,3}
.__ Terminez par: String[] = {"1","2","3","5","11"}
Est-il possible de le faire sans une boucle for? J'ai une boucle pour maintenant pour collecter les ints. Je préférerais ne pas faire une autre boucle.
int[] nums = {5,1,2,11,3}; //List or Vector
Arrays.sort(nums); //Collections.sort() for List,Vector
String a=Arrays.toString(nums); //toString the List or Vector
String ar[]=a.substring(1,a.length()-1).split(", ");
System.out.println(Arrays.toString(ar));
METTRE À JOUR:
Une version plus courte:
int[] nums = {-5,1,2,11,3};
Arrays.sort(nums);
String[] a=Arrays.toString(nums).split("[\\[\\]]")[1].split(", ");
System.out.println(Arrays.toString(a));
Puis-je utiliser une boucle while
à la place?
@Test
public void test() {
int[] nums = {5,1,2,11,3};
Arrays.sort(nums);
String[] stringNums = new String[nums.length];
int i = 0;
while (i < nums.length) {
stringNums[i] = String.valueOf(nums[i++]);
}
Assert.assertArrayEquals(new String[]{"1","2","3","5","11"}, stringNums);
}
Utilisation d'assertions JUnit.
Désolé, je suis désinvolte. Mais dire que vous ne pouvez pas utiliser une boucle for
est idiot, vous devez iterate sur la liste d'une manière ou d'une autre. Si vous appelez une méthode de bibliothèque pour la trier à votre place (cf Collections.sort () ) - vous ferez une boucle sur de façon sur les éléments.
Solution simple utilisant Goyave :
public List<String> toSortedStrings(List<Integer> ints) {
Collections.sort(ints);
return Lists.newArrayList(Iterables.transform(ints,
Functions.toStringFunction()));
}
De toute évidence, cette solution (comme toute autre solution) utilisera des boucles en interne, mais elle l’extrait du code que vous devez lire. Vous pouvez également éviter de modifier l'ordre dans ints
en passant le résultat de Ordering.natural().sortedCopy(ints)
à transform
au lieu d'utiliser Collections.sort
en premier. De plus, la partie Lists.newArrayList
n'est pas nécessaire si vous n'avez pas besoin d'ajouter de nouveaux éléments à la liste résultante.
La version abrégée de ce corps de méthode, avec les importations statiques:
return transform(Ordering.natural().sortedCopy(ints), toStringFunction());
Si vous utilisez un TreeSet, j’ai une (longue) ligne unique pour vous (en supposant que items
est le TreeSet):
final String[] arr =
items.toString() // string representation
.replaceAll("\\D+", " ") // replace all non digits with spaces
.trim() // trim ends
.split(" "); // split by spaces
Code de test:
Set<Integer> items = new TreeSet<Integer>(Arrays.asList(5, 1, 2, 11, 3));
// insert above code here
System.out.println(Arrays.toString(arr));
Sortie:
[1, 2, 3, 5, 11]
MODIFIER:
OK, voici une version différente qui fonctionne directement avec le tableau int. Mais malheureusement, ce n'est pas un one-liner. Cependant, il garde les doublons et c'est probablement plus rapide
EDIT à nouveau:
Nombre de bogues fixes et négatifs pris en charge, comme demandé:
EDIT again : une seule passe regex et pas de trim
final int[] in = { 5, 1, 2, 11, 3, 2, -5 }; // with duplicate
Arrays.sort(in);
final String[] out =
Arrays.toString(in)
.replaceAll("(?:\\[?)([-\\d]+)(?:\\]?)", "$1") // just remove [ and ]
.split("\\s*,\\s*"); // split by comma
System.out.println(Arrays.toString(out));
Sortie:
[-5, 1, 2, 2, 3, 5, 11]
Ou complètement sans regex (sauf split ()), mais avec une étape supplémentaire ajoutée:
final int[] in = { 5, 1, 2, 11, 3, 2, -5 }; // with duplicate
Arrays.sort(in);
final String stringRep = Arrays.toString(in);
final String[] out =
stringRep.substring(1, stringRep.length() - 1).split("\\s*,\\s*");
System.out.println(Arrays.toString(out));
Sortie:
[-5, 1, 2, 2, 3, 5, 11]
Mise à jour: suppression des espaces de mes deux dernières solutions, j'espère que vous êtes heureux maintenant :-)
Utilisation de Java fonctionnel ,
import fj.data.List;
import static fj.data.List.*;
import static fj.pre.Show.*;
.
.
.
final List<Integer> xs = list(5,1,2,11,3);
final List<String> ys = xs.sort(Ord.intOrd).map(
new F<Integer, String>() {
@Override public String f(final Integer i) {
return String.valueOf(i);
}
}
);
listShow(stringShow).println(ys);
Je préférerais ne pas en faire un autre pour boucle.
Cela est bête. C'est un désir stupide et une base stupide pour entreprendre un exercice de code. Si vous pouvez mieux exprimer les qualités que vous souhaitez attribuer à votre code, nous avons quelque chose à dire: il doit être facile à lire, à dire, ou performant, ou testable, ou robuste. Mais "je préférerais le sauter" ne nous donne simplement rien d’utile avec lequel travailler.
Que diriez-vous quelque chose comme ça:
List<String> stringList = new ArrayList<String>();
List<Integer> list = new ArrayList<Integer>(Arrays.asList(5,1,2,11,3));
Collections.sort(list);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
stringList.add(iterator.next().toString());
}
System.out.println(stringList);
Utilisation de Collections EclipseMutableIntList
:
String[] result = IntLists.mutable.with(5, 1, 2, 11, 3)
.sortThis()
.collect(Integer::toString)
.toArray(new String[]{});
Assert.assertArrayEquals(
new String[]{"1", "2", "3", "5", "11"}, result);
Ou échanger une certaine lisibilité pour une efficacité potentielle:
MutableIntList intList = IntLists.mutable.with(5, 1, 2, 11, 3).sortThis();
String[] result = intList.injectIntoWithIndex(
new String[intList.size()],
(r, each, index) -> {
r[index] = Integer.toString(each);
return r;
});
Assert.assertArrayEquals(
new String[]{"1", "2", "3", "5", "11"}, result);
Remarque: je suis un partisan des collections Eclipse
Java 8 way, pas de boucles du tout:
// Given
int[] array = {-5, 8, 3, 10, 25};
// When
String[] actual = Arrays.stream(array)
.sorted()
.mapToObj(String::valueOf)
.toArray(String[]::new);
// Then
String[] expected = {"-5", "3", "8", "10", "25"};
assertArrayEquals(expected, actual);
Vous pouvez utiliser Collections.sort()
, puis parcourir la liste et collecter String.valueOf()
chaque élément.
http://download.Oracle.com/javase/6/docs/api/Java/util/Collections.html#sort%28Java.util.List%29
Pour un vecteur, vous obtiendrez d’abord une liste avec Collections.list(Enumeration e)
.
Pour un tableau, vous utiliseriez Arrays.sort()
au lieu de Collections.sort()
.
http://download.Oracle.com/javase/6/docs/api/Java/util/Arrays.html#sort%28int%5b%5d%29
Pourquoi ne transposez-vous pas simplement ces valeurs en String dans la boucle for originale, en créant un tableau String plutôt qu'un tableau int? En supposant que vous collectiez votre entier initial à partir d'un point de départ et que vous le rajoutiez à chaque itération de boucle for, voici une méthodologie simple pour créer un tableau String plutôt qu'un tableau int. Si vous avez besoin des tableaux int et String contenant les mêmes valeurs, créez-les tous les deux dans la même boucle for et utilisez-les.
yourInt = someNumber;
for (int a = 0; a < aLimit; a ++) {
String stringName = String.valueOf(yourInt);
StringArrayName[a] = stringName;
yourInt ++;
}
Ou, si vous avez besoin des deux:
yourInt = someNumber;
for (int a = 0; a < aLimit; a ++) {
String stringName = String.valueOf(yourInt);
StringArrayName[a] = stringName;
intArrayName[a] = yourInt;
yourInt ++;
}
Je suis d'accord avec tous les autres. Les boucles for sont faciles à construire, ne nécessitent presque pas de temps système et sont faciles à suivre lors de la lecture de code. L'élégance dans la simplicité!
Nous pouvons résoudre ce problème en utilisant une expression régulière comme suit:
int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8};
String str = new String(Arrays.toString(intArray));
String stripNoneDigits= str.replaceAll("[^\\d]", "");
String[] stringArray = stripNoneDigits.split("");