Ce que j'essaie de faire, c'est de lire un fichier .Java, de choisir tous les identifiants et de les stocker dans une liste. Mon problème est avec la méthode .split (). Si vous exécutez ce code tel quel, vous obtiendrez ArrayOutOfBounds, mais si vous modifiez le délimiteur de "." pour toute autre chose, le code fonctionne. Mais j'ai besoin de lignes analysées par "." alors est-ce qu'il y a une autre façon de faire cela?
import Java.io.BufferedReader;
import Java.io.FileNotFoundException;
import Java.io.FileReader;
import Java.io.IOException;
import Java.util.*;
public class MyHash {
private static String[] reserved = new String[100];
private static List list = new LinkedList();
private static List list2 = new LinkedList();
public static void main (String args[]){
Hashtable hashtable = new Hashtable(997);
makeReserved();
readFile();
String line;
ListIterator itr = list.listIterator();
int listIndex = 0;
while (listIndex < list.size()) {
if (itr.hasNext()){
line = itr.next().toString();
//PROBLEM IS HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
String[] words = line.split("."); //CHANGE THIS AND IT WILL WORK
System.out.println(words[0]); //TESTING TO SEE IF IT WORKED
}
listIndex++;
}
}
public static void readFile() {
String text;
String[] words;
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("MyHash.Java")); //NAME OF INPUT FILE
} catch (FileNotFoundException ex) {
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex);
}
try {
while ((text = in.readLine()) != null){
text = text.trim();
words = text.split("\\s+");
for (int i = 0; i < words.length; i++){
list.add(words[i]);
}
for (int j = 0; j < reserved.length; j++){
if (list.contains(reserved[j])){
list.remove(reserved[j]);
}
}
}
} catch (IOException ex) {
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex);
}
try {
in.close();
} catch (IOException ex) {
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static int keyIt (int x) {
int key = x % 997;
return key;
}
public static int horner (String Word){
int length = Word.length();
char[] letters = new char[length];
for (int i = 0; i < length; i++){
letters[i]=Word.charAt(i);
}
char[] alphabet = new char[26];
String abc = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < 26; i++){
alphabet[i]=abc.charAt(i);
}
int[] numbers = new int[length];
int place = 0;
for (int i = 0; i < length; i++){
for (int j = 0; j < 26; j++){
if (alphabet[j]==letters[i]){
numbers[place]=j+1;
place++;
}
}
}
int hornered = numbers[0] * 32;
for (int i = 1; i < numbers.length; i++){
hornered += numbers[i];
if (i == numbers.length -1){
return hornered;
}
hornered = hornered % 997;
hornered *= 32;
}
return hornered;
}
public static String[] makeReserved (){
reserved[0] = "abstract";
reserved[1] = "assert";
reserved[2] = "boolean";
reserved[3] = "break";
reserved[4] = "byte";
reserved[5] = "case";
reserved[6] = "catch";
reserved[7] = "char";
reserved[8] = "class";
reserved[9] = "const";
reserved[10] = "continue";
reserved[11] = "default";
reserved[12] = "do";
reserved[13] = "double";
reserved[14] = "else";
reserved[15] = "enum";
reserved[16] = "extends";
reserved[17] = "false";
reserved[18] = "final";
reserved[19] = "finally";
reserved[20] = "float";
reserved[21] = "for";
reserved[22] = "goto";
reserved[23] = "if";
reserved[24] = "implements";
reserved[25] = "import";
reserved[26] = "instanceof";
reserved[27] = "int";
reserved[28] = "interface";
reserved[29] = "long";
reserved[30] = "native";
reserved[31] = "new";
reserved[32] = "null";
reserved[33] = "package";
reserved[34] = "private";
reserved[35] = "protected";
reserved[36] = "public";
reserved[37] = "return";
reserved[38] = "short";
reserved[39] = "static";
reserved[40] = "strictfp";
reserved[41] = "super";
reserved[42] = "switch";
reserved[43] = "synchronize";
reserved[44] = "this";
reserved[45] = "throw";
reserved[46] = "throws";
reserved[47] = "trasient";
reserved[48] = "true";
reserved[49] = "try";
reserved[50] = "void";
reserved[51] = "volatile";
reserved[52] = "while";
reserved[53] = "=";
reserved[54] = "==";
reserved[55] = "!=";
reserved[56] = "+";
reserved[57] = "-";
reserved[58] = "*";
reserved[59] = "/";
reserved[60] = "{";
reserved[61] = "}";
return reserved;
}
}
String.split
prend une expression rationnelle et '.' a une signification spéciale pour les regex.
Vous voulez (probablement) quelque chose comme:
String[] words = line.split("\\.");
Certaines personnes semblent avoir du mal à faire fonctionner cela. Voici donc du code exécutable que vous pouvez utiliser pour vérifier le comportement correct.
import Java.util.Arrays;
public class TestSplit {
public static void main(String[] args) {
String line = "aa.bb.cc.dd";
String[] words = line.split("\\.");
System.out.println(Arrays.toString(words));
// Output is "[aa, bb, cc, dd]"
}
}
Lorsque vous séparez avec un délimiteur de littéral de chaîne, le moyen le plus sûr consiste à utiliser la méthode Pattern.quote () :
String[] words = line.split(Pattern.quote("."));
Comme décrit dans d'autres réponses, la scission avec "\\."
Est correcte, mais quote()
le fera pour vous.
L'argument à scinder est une expression régulière. Le point est un métacaractère d'expression régulière qui correspond à tout. Ainsi, chaque caractère de line
est considéré comme un caractère scindé et est jeté. Toutes les chaînes vides entre eux sont également jetées (car elles sont chaînes vides). Le résultat est que vous n'avez plus rien.
Si vous échappez à la période (en ajoutant une barre oblique inverse avant celle-ci), vous pouvez faire correspondre les périodes littérales. (line.split("\\.")
)
Avez-vous essayé d'échapper au point? comme ça:
String[] words = line.split("\\.");
C’est certainement pas le meilleur moyen de le faire, mais j’ai réussi en faisant quelque chose comme suivre.
String imageName = "my_image.png";
String replace = imageName.replace('.','~');
String[] split = replace.split("~");
System.out.println("Image name : " + split[0]);
System.out.println("Image extension : " + split[1]);
Sortie,
Image name : my_image
Image extension : png
L'argument à scinder est une expression régulière. "." correspond à quoi que ce soit, donc votre délimiteur à diviser est n'importe quoi.
Si les performances posent problème, vous devriez envisager d'utiliser StringTokenizer
au lieu de split
. StringTokenizer
est beaucoup plus rapide que split
, même s’il s’agit d’une classe "ancienne" (mais non obsolète).
Vous pourriez être intéressé par la classe StringTokenizer . Cependant, les docs Java vous conseillent d'utiliser la méthode .split car StringTokenizer est une classe héritée.