【问题标题】:Java - store elements of ArrayList into separate blocksJava - 将 ArrayList 的元素存储到单独的块中
【发布时间】:2014-03-13 20:14:55
【问题描述】:

这是我的所有代码,总而言之,它标准化了两个文本文件,然后打印出结果。

import java.io.*;
import java.util.*;

public class Plagiarism {

    public static void main(String[] args) {

        Plagiarism myPlag = new Plagiarism();

        if  (args.length == 0) {
            System.out.println("Error: No files input");
        }
        else if (args.length > 0) {
            try {
                for (int i = 0; i < args.length; i++) {
                    BufferedReader reader = new BufferedReader (new FileReader (args[i]));
                    List<String> foo = simplify(reader);
                        for (int j = 0; j < foo.size(); j++) {
                            System.out.print(foo.get(j));
                        }
                }
            }
            catch (Exception e) {
                System.err.println ("Error reading from file");
            }
        }
    }

    public static List<String> simplify(BufferedReader input) throws IOException {
        String line = null;
        List<String> myList = new ArrayList<String>();

        while ((line = input.readLine()) != null) {
            myList.add(line.replaceAll("[^a-zA-Z0-9]","").toLowerCase().trim());
        }
        return myList;  
    }

}

我要实现的下一点是:使用命令行,第三个参数将是用户输入的任何整数(块大小)。然后我必须使用它将该数组的元素存储到重叠的单独块中。 EG:猫坐在垫子上,块大小为 4。块 1 将是:Thec 块 2:heca 块 3:ecat,依此类推,直到它到达数组的末尾。

有什么想法吗?

提前谢谢各位。

【问题讨论】:

    标签: java arraylist block bufferedreader filereader


    【解决方案1】:

    要获取块大小,请使用:

    if(args.length != 4)
        return;
    int blockSize = Integer.valueOf(args[3]);
    

    这个例子可以帮助你

    import java.util.*;
    
    public class Test {
        public static void main(String[] args) {
        String line = "The dog is in the house";
        line = line.replace(" ", "");
        List<String> list = new ArrayList<String>();
        for (int i = 0; i <= line.length() - 4; i++) 
            list.add(line.substring(i, i + 4));
        System.out.println(list);
    

    }

    输出:

    [Thed, hedo, edog, dogi, ogis, gisi, isin, sint, inth, nthe, theh, heho, ehou, hous, ouse]
    

    这就是你想做的事

    【讨论】:

    • 确定是 args[2],因为这是 cmd 中的第三个参数?
    • 当你这样调用你的程序时:myProgram arg1 arg2 arg3,args 数组将包含:args[0] = myProgram, args[1] = arg1, args[2] = arg2, args[ 3] = arg3.
    • 嗯,好的。另外,我正在使用 ArrayLists,所以当我尝试使用 substring() 时出现错误
    • 您遇到了什么错误?我忘记了一个括号是你得到的错误?
    • 不,找不到符号子字符串,因为我正在使用列表
    【解决方案2】:

    我们可以用多种方式编码,这里是一个例子。

    输入 3 个参数,前 2 个是文件,第 3 个是块大小:

    文件 1 包含:这是一个男孩

    文件2包含:这是一个女孩

    块大小:4

    预期输出:

    this hisi isis sisa isab sabo aboy boyt oyth ythi this hisi isis sisa isag sagi agir girl

    程序:

    导入 java.io.; 导入 java.util.;

    公开课抄袭{

    public static void main(String[] args) {
        //Plagiarism myPlag = new Plagiarism();
    
        /*args = new String[3];
        Scanner s = new Scanner(System.in);
        System.out.println("Enter the 1st file path");
        args[0] = s.next();
         System.out.println("Enter the 2nd file path");
         args[1] = s.next();
         System.out.println("Enter size of block");
         args[2] = s.next();*/
    
        int blockSize = Integer.valueOf(args[2]);
    
        StringBuilder wholeContent = new StringBuilder("");
    
    
        if  (args.length == 0) {
            System.out.println("Error: No files input");
        }
        else if (args.length > 0) {
            try {
                for (int i = 0; i < args.length-1; i++) {
                    BufferedReader reader = new BufferedReader (new FileReader (args[i]));
                    List<String> foo = simplify(reader);                   
                        for (int j = 0; j < foo.size(); j++) {
                            //System.out.print(foo.get(j));
                            wholeContent.append(foo.get(j));
    
                        }
                }
    
    
                System.out.println("The content of Line is = "+ wholeContent);
                System.out.println("The content of line based on the block size = "+ blockSize + " is:");
                for(int j=0; j<=(wholeContent.length()-blockSize); j++){
                                System.out.print(wholeContent.substring(j, j+4));
                                System.out.print(" ");
                }
    
            }
            catch (Exception e) {
                e.printStackTrace();
                System.err.println ("Error reading from file");
            }
        }
    }
    
    public static List<String> simplify(BufferedReader input) throws IOException {
        String line = null;
        List<String> myList = new ArrayList<String>();
    
        while ((line = input.readLine()) != null) {
                if(!" ".equals(line))
            myList.add(line.replaceAll("[^a-zA-Z0-9]","").toLowerCase().trim());
        }
        return myList;  
    }
    

    }

    【讨论】:

      【解决方案3】:

      您要求做的所有事情都可以通过字符串操作来完成。首先使用 replaceAll() 删除空格,然后使用 for 循环和 substring() 创建块。

      对于你的 for 循环,你需要修改它以便它读取两个文本,然后使用第三个参数作为块大小,这样你就可以改变你的 for 循环:

      for(int i = 0; i<args.length;i++)
      

      到:

      for(int i = 1; i<3; i++)
      

      这会读取前两个参数,但不会读取第三个

      【讨论】:

      • 我意识到了这一点,但苦苦挣扎如何使用指定块大小的命令行参数?
      • 那么你的命令行参数现在是什么样子的?
      • java抄袭(文本文件)(文本文件)(块参数会在这里)
      • 好的,那是什么问题,你可以说 java Plagiarism text1.txt text2.txt 5 应该可以工作
      • 第一个参数是程序名。所以循环应该从 i = 1
      猜你喜欢
      • 2022-09-30
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多