J'ai un double
double pi = 3.1415;
Je veux convertir ceci en un tableau int
int[] piArray = {3,1,4,1,5};
Je suis venu avec ça
double pi = 3.1415;
String piString = Double.toString(pi).replace(".", "");
int[] piArray = new int[piString.length()];
for (int i = 0; i <= piString.length()-1; i++)
piArray[i] = piString.charAt(i) - '0';
Cela fonctionne mais je n'aime pas cette solution car je pense qu'un grand nombre de conversions entre types de données peut entraîner des erreurs. Mon code est-il complet ou dois-je vérifier quelque chose d'autre?
Et comment aborderiez-vous ce problème?
Je ne sais pas directement mais je pense que c'est plus simple:
int[] piArray = String.valueOf(pi)
.replaceAll("\\D", "")
.chars()
.map(Character::getNumericValue)
.toArray();
Puisque vous voulez éviter les conversions, voici la méthode arithmétique, en supposant que vous n’ayez à traiter que des nombres positifs:
List<Integer> piList = new ArrayList<>();
double current = pi;
while (current > 0) {
int mostSignificantDigit = (int) current;
piList.add(mostSignificantDigit);
current = (current - mostSignificantDigit) * 10;
}
Le traitement des nombres négatifs peut être facilement effectué en vérifiant d'abord le signe puis en utilisant le même code avec current = Math.abs(pi)
.
Notez qu'en raison de l'arithmétique à virgule flottante, vous obtiendrez des résultats inattendus pour les valeurs qui ne peuvent pas être parfaitement représentées en binaire.
Voici une idée qui illustre le problème et où vous pouvez essayer mon code.
int[] result = Stream.of(pi)
.map(String::valueOf)
.flatMap(x -> Arrays.stream(x.split("\\.|")))
.filter(x -> !x.isEmpty())
.mapToInt(Integer::valueOf)
.toArray();
Ou une approche plus sûre avec Java-9
:
int[] result = new Scanner(String.valueOf(pi))
.findAll(Pattern.compile("\\d"))
.map(MatchResult::group)
.mapToInt(Integer::valueOf)
.toArray();
Vous pouvez utiliser en Java 8
int[] piArray = piString.chars().map(Character::getNumericValue).toArray();
cela fonctionnerait aussi
int[] piArray = piString.chars().map(c -> c-'0').toArray();