source

Java에서 String.split()를 사용하여 구분자로 "."를 사용하려면 어떻게 해야 합니까?

factcode 2022. 9. 23. 00:04
반응형

Java에서 String.split()를 사용하여 구분자로 "."를 사용하려면 어떻게 해야 합니까?

제가 하려고 하는 것은 .java 파일을 읽고 모든 식별자를 선택하여 목록에 저장하는 것입니다.문제는 .split() 메서드에 있습니다.이 코드를 그대로 실행하면 ArrayOutOfBounds가 표시되지만 딜리미터를 "."에서 다른 것으로 변경하면 코드가 작동합니다.그러나 "로 해석된 행을 사용해야 합니다.다른 방법이 있을까요?

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 는 정규식을 취하며, '.'는 정규식에 대해 특별한 의미를 가집니다.

다음과 같은 것이 필요할 수 있습니다.

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

일부 사용자는 이 작업을 수행하는 데 어려움을 겪고 있는 것 같습니다. 따라서 올바른 동작을 확인하기 위해 사용할 수 있는 실행 가능한 코드를 몇 가지 소개합니다.

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

문자열 리터럴 딜리미터로 분할하는 경우 가장 안전한 방법은 패턴을 사용하는 것입니다.quote() 메서드:

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

다른 답변에서 설명한 것처럼 분할"\\."맞는데quote()당신을 위해 탈출시켜줄 거야

분할 인수는 정규 표현입니다.마침표는 모든 문자와 일치하는 정규 표현 메타문자입니다.따라서 이 문자의 모든 문자는line는 분할문자로 간주되어 폐기되고 그 사이에 있는 빈 문자열은 모두 폐기됩니다(빈 문자열이기 때문에).그 결과 당신은 아무것도 남지 않았습니다.

마침표를 이스케이프한 경우(스케이프된 백슬래시를 그 전에 추가함으로써), 리터럴 마침표를 일치시킬 수 있습니다.(line.split("\\."))

당신은 점을 피해본 적이 있나요?다음과 같습니다.

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

이것은 확실히 최선의 방법은 아니지만, 나는 다음과 같은 방법으로 그것을 해냈다.

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

산출량,

Image name : my_image
Image extension : png

분할 인수는 정규 표현입니다.". "는 임의의 것과 일치하므로 분할할 구분자는 임의의 것입니다.

퍼포먼스가 문제가 되는 경우는,StringTokenizer대신split.StringTokenizer보다 훨씬 빠르다split(단, 권장되지 않는) 클래스인 경우에도 마찬가지입니다.

StringTokenizer 클래스에 관심이 있을 수 있습니다.단, Java 문서에서는 StringTokenizer는 레거시클래스이므로 .split 메서드를 사용하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/2755945/how-can-i-use-as-the-delimiter-with-string-split-in-java

반응형