必做实验6 输入输出应用

(1.1)使用Java语言读取解压后的文件(Watches.txt),并得到以下文件(40分):

review.txt:每行3列,以分号作为分隔符,第1列是userID,第2列是productID,第3列是summary;表示(user, product, summary)三元组。该文件中不同行之间的顺序按照userID从小到大排列,当userID相同时按照productID从小到大排列。注:如果没有按照userID或productID从小到大排序扣5分。

这道题用到对txt文件的字符流处理,其中最主要是对每一行字符进行识别和分割。而我打开文件后发现,每隔11行存储一组数据。比较有趣的是我一开始记事本打开文件时数行数的时候还以为第一组数据有11行,第二组10行,还以为都是不规律的,直到点了一下第10和第11行,发现它们都属于第10行,第“10”行末尾没有换行符吧是记事本一行最多存1000列。Ps:Watches文件要放在和src、out等的同级目录下。

源代码如下:

  首先是main后面抛出异常,然后一众初始化,我用text字符串数组记录了user, product, summary它们在文件中的格式,方便后面作比较,然后定义了FileReader类型的freader读取Watches中的内容、BufferReader类型的breader,freader为其参数、FileWriter 类型的fwriter以写到文件review.txt、bwriter同fwriter,ss记录三元组中的元素,sss存储写入review.txt的内容(999999应该够了吧),s后面用于记录文件Watches每一行的数据。

String []text={"review/userId: ","product/productId: ","review/summary: "};//存储不同字符信息
        FileReader freader=new FileReader("Watches.txt");
        BufferedReader breader=new BufferedReader(freader);
        FileWriter fwriter=new FileWriter("review.txt");
        BufferedWriter bwriter=new BufferedWriter(fwriter);
        String []ss=new String[3];//三元组,所以开了长度为3的字符串数组
        String [][]sss=new String[999999][3];
        String s;
        int count1=0,count2=0;

然后是对Watches文件里有用信息的提取,注意每11行提取一次:

while((s=breader.readLine())!=null){
                count1++;
                for(int i=0;i<3;i++){//对题目有用的信息进行提取
                    if(s.indexOf(text[i])!=-1){
                        ss[i]=s.substring(text[i].length());
                        break;
                    }
                }
                if(count1%11==0){//每11行为一组信息。所以11行存储一次
                    sss[count2][0]=ss[0]+";";//用sss存储结果,方便后续排序并且写入
                    sss[count2][1]=ss[1]+";";//直接用String的特性加上分隔符
                    sss[count2++][2]=ss[2]+"\n";
                }
        }

   然后是自定义的sort,都是直接用的String的内置方法:

Arrays.sort(sss,0,count2,new Comparator<>(){
            public int compare(String []s1,String []s2){//自定义sort
               if(!s1[0].equals(s2[0])) return s1[0].compareTo(s2[0]);
               return s1[1].compareTo(s2[1]);//利用compareTo来比较
            }
        });

最后是文件读入以及关闭:

for(int i=0;i<count2;i++)
            for(int j=0;j<3;j++)
                bwriter.write(sss[i][j]);
        bwriter.flush();//文件关闭
        freader.close();

  运行结果,如图可见运行成功(应该吧--至少看起来没毛病)

全部代码:

import java.io.*;
import java.lang.String;
import java.util.*;
public class first {
    public static void main(String []args) throws IOException {
        String []text={"review/userId: ","product/productId: ","review/summary: "};//存储不同字符信息
        FileReader freader=new FileReader("Watches.txt");
        BufferedReader breader=new BufferedReader(freader);
        FileWriter fwriter=new FileWriter("review.txt");
        BufferedWriter bwriter=new BufferedWriter(fwriter);
        String []ss=new String[3];//三元组,所以开了长度为3的字符串数组
        String [][]sss=new String[999999][3];
        String s;
        int count1=0,count2=0;
        while((s=breader.readLine())!=null){
                count1++;
                for(int i=0;i<3;i++){//对题目有用的信息进行提取
                    if(s.indexOf(text[i])!=-1){
                        ss[i]=s.substring(text[i].length());
                        break;
                    }
                }
                if(count1%11==0){//每11行为一组信息。所以11行存储一次
                    sss[count2][0]=ss[0]+";";//用sss存储结果,方便后续排序并且写入
                    sss[count2][1]=ss[1]+";";//直接用String的特性加上分隔符
                    sss[count2++][2]=ss[2]+"\n";
                }
        }
        Arrays.sort(sss,0,count2,new Comparator<>(){
            public int compare(String []s1,String []s2){//自定义sort
               if(!s1[0].equals(s2[0])) return s1[0].compareTo(s2[0]);
               return s1[1].compareTo(s2[1]);//利用compareTo来比较
            }
        });
        for(int i=0;i<count2;i++)
            for(int j=0;j<3;j++)
                bwriter.write(sss[i][j]);
        bwriter.flush();//文件关闭
        freader.close();
    }
}

(1.2)使用Java语言根据review.txt进行计算,并得到以下文件(40分):

userNeighborhood.txt:每行11列,以分号作为分隔符,第1列是userID,第2-10列是与该用户最相似的10个用户的userID,按相似度值从大到小排列,其中相似度是通过review.txt中的前两列计算得到的Jaccard index值。该文件中不同行之间的顺序,按照第1列的userID从小到大排列。注:如果没有使用多线程实现扣5分,如果没有按相似度从大到小排列扣5分。

没写出来,摆烂交了不能运行的代码上去qwq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值