Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建一个静态解析方法,该方法接受带有制表符分隔部分的字符串?_Java_Eclipse - Fatal编程技术网

Java 如何创建一个静态解析方法,该方法接受带有制表符分隔部分的字符串?

Java 如何创建一个静态解析方法,该方法接受带有制表符分隔部分的字符串?,java,eclipse,Java,Eclipse,我怎样才能开始。我知道如何制作这个方法,但我不知道到底要在里面放些什么。我正在制作一个歌曲类,它包含年份、歌曲排名、艺术家和头衔。我从另一个txt文件中获取此信息。歌曲应该有一个静态解析方法,它接受一个带有制表符分隔部分的字符串并返回一个歌曲对象。 这是我开始使用的代码,但我不知道这是否合法。我也不知道它是否真的能正常工作 public class Billboard { private int year; private int rank; private String artist; pri

我怎样才能开始。我知道如何制作这个方法,但我不知道到底要在里面放些什么。我正在制作一个歌曲类,它包含年份、歌曲排名、艺术家和头衔。我从另一个txt文件中获取此信息。歌曲应该有一个静态解析方法,它接受一个带有制表符分隔部分的字符串并返回一个歌曲对象。 这是我开始使用的代码,但我不知道这是否合法。我也不知道它是否真的能正常工作

public class Billboard {
private int year;
private int rank;
private String artist;
private String title;


public void setYear(int Y){
    this.year = Y;
}
public void setRank(int R){
    this.rank = R;
}
public void setArtist(String A){
    this.artist = A;
}
public void setTitle(String T){
    this.title = T;
}
public int getYear(){
    return this.year;
}
public int getRank(){
    return this.rank;
}
public String getArtist(){
    return this.artist;
}
public String getTitle(){
    return this.title;
}

public void Song (String Line) {
String[] token = line.split("\t");
title = token[0];
artist = token[1];
year = Integer.parseInt(token[2]);

   }
}

换成

public static Song createSong (String aLine_in)
注意这些变化:

  • static
    添加了关键字

  • 方法名称以小写字母开头。(寻找更合适的名称)

  • 局部变量/方法参数以小写字母开头。因为它是一个参数,中的
    \u是前缀

  • 您可以按如下方式调用静态方法:

    Song aSong = Song.createSong("...\t...\t...");
    

    您不能将此方法设置为静态,因为它访问对象变量:
    title,artist,year

    因此,您需要使用构造函数,或将对象传递给方法:

    public Billboard (String Line) {
        String[] token = line.split("\t");
        this.title = token[0];
        this.artist = token[1];
        this.year = Integer.parseInt(token[2]);
    }
    

    歌曲课:

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import utils.Utils;
    
    public class Song {
    
        private String title;
        private String artist;
        private int rank;
        private int year;
    
        public Song(String title, String artist, int rank, int year){
            this.title = title;
            this.artist = artist;
            this.year = year;
            this.rank = rank;
        }
    
        public String getTitle() {
            return title;
        }
    
        public String getArtist() {
            return artist;
        }
    
        public int getRank() {
            return rank;
        }
    
        public int getYear() {
            return year;
        }
    
        public static Song parseLine(String line, String delimiter) {
            String[] parts = Utils.splitLine(line, delimiter);
            return new Song(parts[0], parts[1], Integer.parseInt(parts[2]),Integer.parseInt(parts[3]));
        }
    
        public static List<Song> readFile(String dataFile) {
            List<Song> lines = new ArrayList<Song>();
            String line = null;
    
    
            try{
                FileReader fr = new FileReader(new File(dataFile));
                BufferedReader br = new BufferedReader(fr);
    
                while((line = br.readLine()) != null){
                    lines.add(parseLine(line, "\t"));
                }
    
            }catch(IOException e){
                e.printStackTrace();
            }
    
            return lines;
        }
    
            @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((artist == null) ? 0 : artist.hashCode());
            result = prime * result + rank;
            result = prime * result + ((title == null) ? 0 : title.hashCode());
            result = prime * result + year;
            return result;
        }
    
        @Override
    public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Song other = (Song) obj;
            if (artist == null) {
                if (other.artist != null)
                    return false;
            } else if (!artist.equals(other.artist))
                return false;
            if (rank != other.rank)
                return false;
            if (title == null) {
                if (other.title != null)
                    return false;
            } else if (!title.equals(other.title))
                return false;
            if (year != other.year)
                return false;
            return true;
        }
    
    
    }    
    

    如果您想知道它是否有效,那么我建议您为它编写一个单元测试。
    public static Billboard parseString(String Line) {
        return parseString(line, new Billboard());
    }
    
    public static Billboard parseString(String Line, Billboard billboard) {
        String[] token = line.split("\t");
        billboard.setTitle(token[0]);
        billboard.setArtist(token[1]);
        billboard.setYear(Integer.parseInt(token[2]));
        return billboard;
    }
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import utils.Utils;
    
    public class Song {
    
        private String title;
        private String artist;
        private int rank;
        private int year;
    
        public Song(String title, String artist, int rank, int year){
            this.title = title;
            this.artist = artist;
            this.year = year;
            this.rank = rank;
        }
    
        public String getTitle() {
            return title;
        }
    
        public String getArtist() {
            return artist;
        }
    
        public int getRank() {
            return rank;
        }
    
        public int getYear() {
            return year;
        }
    
        public static Song parseLine(String line, String delimiter) {
            String[] parts = Utils.splitLine(line, delimiter);
            return new Song(parts[0], parts[1], Integer.parseInt(parts[2]),Integer.parseInt(parts[3]));
        }
    
        public static List<Song> readFile(String dataFile) {
            List<Song> lines = new ArrayList<Song>();
            String line = null;
    
    
            try{
                FileReader fr = new FileReader(new File(dataFile));
                BufferedReader br = new BufferedReader(fr);
    
                while((line = br.readLine()) != null){
                    lines.add(parseLine(line, "\t"));
                }
    
            }catch(IOException e){
                e.printStackTrace();
            }
    
            return lines;
        }
    
            @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((artist == null) ? 0 : artist.hashCode());
            result = prime * result + rank;
            result = prime * result + ((title == null) ? 0 : title.hashCode());
            result = prime * result + year;
            return result;
        }
    
        @Override
    public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Song other = (Song) obj;
            if (artist == null) {
                if (other.artist != null)
                    return false;
            } else if (!artist.equals(other.artist))
                return false;
            if (rank != other.rank)
                return false;
            if (title == null) {
                if (other.title != null)
                    return false;
            } else if (!title.equals(other.title))
                return false;
            if (year != other.year)
                return false;
            return true;
        }
    
    
    }    
    
    public class Utils {
    
        public static String[] splitLine(String line, String delimiter) {
            if(delimiter.equals("|")){
                delimiter = "\\|";
            }
    
            if(delimiter.equals(".")){
                delimiter = "\\.";
                }
    
            String[] rtn = line.split(delimiter);
            for(int i=0;i<rtn.length;i++){
                rtn[i] = rtn[i].trim();
            }
    
            return rtn;
        }
    }
    
    import static org.junit.Assert.*;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Test;
    
    
    public class HelpTest {
    
        @Test
        public void test_parseLine() {
            // tabs betwen the title artist year and rank
            String line = "Run Runaway  Slade   20  1984";
            Song expected = new Song("Run Runaway","Slade", 20, 1984);
            Song actual = Song.parseLine(line, "\t");   
            assertEquals(expected, actual);
    
        }
    
        @Test
        public void test_readFile() {
            String path = "src/testSongData";
            Song song = new Song("Run Runaway","Slade", 20, 1984);
            List<Song> expected = new ArrayList<Song>();
            expected.add(song);
            List<Song> actual = Song.readFile(path);
            assertEquals(expected, actual);
    
        }
    
    }
    
    Run Runaway Slade   20  1984