Hoe kan ik “.” als het scheidingsteken met String.split() in java

Wat ik probeer te doen, is een .java-bestand lezen, alle identifiers eruit halen en ze in een lijst opslaan. Mijn probleem is met de .split() methode. Als u deze code uitvoert zoals deze is, krijgt u ArrayOutOfBounds, maar als u het scheidingsteken wijzigt van “.” voor iets anders werkt de code. Maar ik moet regels ontleed door “.” dus is er een andere manier waarop ik dit kan bereiken?

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;
    }
}

Antwoord 1, autoriteit 100%

String.splitneemt een regex, en ‘.’ heeft een speciale betekenis voor regexen.

Je wilt (waarschijnlijk) zoiets als:

String[] words = line.split("\\.");

Sommige mensen lijken problemen te hebben om dit werkend te krijgen, dus hier is een uitvoerbare code die u kunt gebruiken om correct gedrag te verifiëren.

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]"
  }
}

Antwoord 2, autoriteit 24%

Bij het splitsen met een letterlijke tekenreeksscheidingsteken is de veiligste manier om de Pattern.quote()methode:

String[] words = line.split(Pattern.quote("."));

Zoals beschreven door andere antwoorden, is splitsen met "\\."correct, maar quote()zal dit voor je doen.


Antwoord 3, autoriteit 4%

Het argument om te splitsen is een reguliere expressie. De punt is een metateken voor reguliere expressies dat met alles overeenkomt, dus elk teken in linewordt beschouwd als een gesplitst teken en wordt weggegooid, en alle lege strings ertussen worden weggegooid (omdat ze zijn lege strings). Het resultaat is dat je niets meer hebt.

Als u de punt ontwijkt (door een backslash met een escapeteken ervoor toe te voegen), kunt u letterlijke punten matchen. (line.split("\\."))


Antwoord 4, autoriteit 2%

Heb je geprobeerd om aan de punt te ontsnappen? zoals dit:

String[] words = line.split("\\.");


Antwoord 5

Dit is absoluut nietde beste manier om dit te doen, maar ik heb het voor elkaar gekregen door iets als het volgende te doen.

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]);

Uitvoer,

Image name : my_image
Image extension : png

Antwoord 6

Het argument om te splitsen is een reguliere expressie. “.” komt overal overeen, dus je scheidingsteken om op te splitsen is alles.


Antwoord 7

Als prestaties een probleem zijn, kunt u overwegen StringTokenizerte gebruiken in plaats van split. StringTokenizeris veel sneller dan split, ook al is het een “legacy” klasse (maar niet verouderd).


Antwoord 8

Misschien ben je geïnteresseerd in de StringTokenizerklas. De Java-documenten adviseren echter dat u de .split-methode gebruikt, aangezien StringTokenizer een legacy-klasse is.

Other episodes