167 votes

Combien de caractères peut avoir une chaîne Java ?

J'essaie Le prochain palindrome problème de Sphere Online Judge (SPOJ) où je dois trouver un palindrome pour un nombre entier allant jusqu'à un million de chiffres. J'ai pensé à utiliser les fonctions de Java pour inverser les chaînes de caractères, mais permettraient-elles à une chaîne de caractères d'être aussi longue ?

0 votes

Vous voulez dire que vous devez écrire une fonction qui génère des palindromes, dont la taille est spécifiée par l'utilisateur et peut atteindre 1 million de caractères ?

3 votes

Le site Problème (de SPOJ) peut contenir un fichier de 100Gigabyte, et vous voulez le charger dans une chaîne en une fois ? Sérieusement... utilisez un scanner !

0 votes

253voto

Bill the Lizard Points 147311

Vous devriez pouvoir obtenir une chaîne de longueur

  1. Integer.MAX_VALUE toujours 2,147,483,647 (2 31 - 1)
    (Définie par la spécification Java, la taille maximale d'un tableau, que la classe String utilise pour le stockage interne)
    OU

  2. Half your maximum heap size (puisque chaque caractère représente deux octets) le plus petit des deux .

43 votes

... ou votre taille maximale du tas divisée par 2 ... puisque le caractère est de 2 octets

2 votes

@ChssPly76 : Oui, c'est exact. J'ai modifié ma réponse, merci.

2 votes

Comment puis-je connaître la taille maximale du tas ? De plus, je ne sais pas quelle machine virtuelle java le juge utilise pour tester mon problème ; Integer.MAX_VALUE fait-il partie des spécifications de la JVM dépendante ?

21voto

aperkins Points 4959

Je crois qu'ils peuvent avoir jusqu'à 2^31-1 caractères, car ils sont contenus dans un tableau interne, et les tableaux sont indexés par des entiers en Java.

0 votes

L'implémentation interne n'est pas pertinente - il n'y a aucune raison pour que les données de caractères ne puissent pas être stockées dans un tableau de longs, par exemple. Le problème est que l'interface utilise des ints pour la longueur. getBytes et similaires peuvent avoir des problèmes si vous essayez une très grande chaîne.

0 votes

C'est vrai, c'est ce que je voulais dire. C'est ma faute.

5voto

Avez-vous envisagé d'utiliser BigDecimal au lieu de String pour contenir vos numéros ?

1 votes

Cela dépend de ce que l'application va faire avec les chiffres. S'il s'agit simplement de faire des choses textuelles comme trouver des palindromes, compter des chiffres (décimaux), alors un String est préférable. S'il s'agit de faire de l'arithmétique, un BigDecimal (ou BigInteger) est préférable.

0 votes

Le problème est le suivant : "Pour chaque K, donnez le plus petit palindrome plus grand que K". (où K est le nombre donné). Il serait trivialement simple d'afficher le premier palindrome plus petit que K. Vous avez besoin de l'arithmétique pour en trouver un plus grand que K. Exemple : Trouver le prochain palindrome plus grand que 999999999999, ou le prochain palindrome plus grand que 12922.

4voto

Mite Mitreski Points 1238

Integer.MAX_VALUE est la taille maximale de la chaîne de caractères + dépend de la taille de votre mémoire mais le problème sur le juge en ligne de la sphère vous ne devez pas utiliser ces fonctions.

-1voto

Joe Plante Points 2733

La partie "tas" s'aggrave, mes amis. L'UTF-16 n'est pas garanti d'être limité à 16 bits et peut s'étendre à 32 bits.

2 votes

À l'exception de celui de Java char est de 16 bits exactement, donc le nombre de bits utilisés par UTF-16 n'a pas vraiment d'importance...

0 votes

@awksp : char est de 16 bits, mais une caractère dans un String peut occuper deux char (deux éléments de code "de substitution" pour représenter un caractère en UTF16). Cependant, le Q ne concernait que chiffres décimaux et ce ne sont pas seulement des BMP mais aussi des 8859-1/block0 et des ASCII.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X