输入文件in.txt:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60%
……
……
……(还有许多条记录)输出:图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
java Y 101 B 234 98%
C Z 11 V 345
RUBY 30 X 60%第1个属性输出都变为“图书名”,第2个都变为“作者”,……,……
这样怎么实现。最好有点代码,谢。当然最好是这样实现:第1个属性是N条记录中相应出现此时最多的那个,比如“图书名”出现10次,“书名”5次,“丛书”2次,
那么第1个属性就是“图书名”了,这样相对于上面的话要复杂一点了。现在的想法是采用本体技术,前提是现在已经知道在N条记录中出现的所有属性名,例如:
String[][] attriClassTable=
{{“00000000,图书名,书名,丛书名,原书名, 商品名,…},
{“00000001,作者,作者名,著译者,…},
{“00000010,商品价格,书价,单价,价格, …},
…
}分1次只能100了,200现在1次给不了,只能这样了,解决以后在加分吧,呵呵。
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60%
……
……
……(还有许多条记录)输出:图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
java Y 101 B 234 98%
C Z 11 V 345
RUBY 30 X 60%第1个属性输出都变为“图书名”,第2个都变为“作者”,……,……
这样怎么实现。最好有点代码,谢。当然最好是这样实现:第1个属性是N条记录中相应出现此时最多的那个,比如“图书名”出现10次,“书名”5次,“丛书”2次,
那么第1个属性就是“图书名”了,这样相对于上面的话要复杂一点了。现在的想法是采用本体技术,前提是现在已经知道在N条记录中出现的所有属性名,例如:
String[][] attriClassTable=
{{“00000000,图书名,书名,丛书名,原书名, 商品名,…},
{“00000001,作者,作者名,著译者,…},
{“00000010,商品价格,书价,单价,价格, …},
…
}分1次只能100了,200现在1次给不了,只能这样了,解决以后在加分吧,呵呵。
请问哪里表述的不怎么清楚。输入的文件也可以这样:图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
java Y 101 B 234 98%
C Z 11 V 345 93%丛书名 作者名 单价 出版处 打折
c++ X 100 A 95%
C Z 11 V 93%书名 著译者 价钱 出版地 ISBN号
PHP X 100 A 123
JSP Y 101 B 234
C Z 11 V 345
……
……哪种输入格式对于实现简单就哪种吧^^
- <表名>
- <row no="1">
<add key="图书名" value="vv" />
<add key="作者 " value="2" />
<add key="书价" value="www.baidu.com;www.sina.com;" />
</row>
- <row no="2">
<add key="图书名" value="liyong" />
<add key="作者 " value="1" />
<add key="书价" value="www.baidu.com;" />
</row>
- <row no="3">
<add key="图书名" value="wzh" />
<add key="作者 " value="0" />
<add key="书价" value="www.baidu.com;" />
</row>
</NetAddress>
为什么不考虑用XML文件存储
最好一行显示一组字段或者信息,就像你写的这样:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60% 然后按照行读取数据,字段的行用空格分隔就知道都是什么信息了,比如分隔后的第一行第一个字段就是图书名,那么从第2行开始分隔后的第一个字段就是图书名的信息,你可以一次放到一个数组里,如果判断下一行开头的第一个字段是“书名”,那么这一行的数据都不用加在数组里,而是读这行的下一行去装如数组。这样依次类推的话 你就可以把各个字段的数据都放在各自的数组里了,书名数组里全是书,作者数组里全是作者等等。
然后你对每个数组遍历,看看是是否有重复的书或者作者什么的,此时 你定义一个计数器,每找到一个相同的你就进行累加。然后把累加数最大的放在前面。在你输出的时候,你就可以先输出一行字段头,然后依次把各个数组的数据输出到指定的位置就可以了。就是文件流的操作,没有别的吧,你在整理一下应该能简化的更好,相信你了^_^
c++ X 100 A 123
图书名 作者 书价 出版社 打折
c++ X 100 A 95%
……
这些都是一条条的记录,像上面那2条记录,最后应该这样的输出:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
分两个贴,主文件:package bookProcess;import java.util.List;public class BookFileProcessor { public BookFileProcessor(String inTextFile, String outTextFile)
{
List<String> inStrList = NormalFileProcesser.getStringFromFile(inTextFile);
List<String> outStrList = processList(inStrList);
String outContent = listToString(outStrList);
NormalFileProcesser.setContentToFile(outTextFile, outContent);
}
private List<String> processList(List<String> inStrList)
{
for (int i = 0; i < inStrList.size(); i++)
{
if ( i%2 == 0)
{
/*目前偶数列为需要替换对象*/
String line = inStrList.get(i);
inStrList.remove(i);
System.out.println();
inStrList.add(i, processLine(line, repalceStr));
}
}
return inStrList;
}
private String listToString(List<String> strList)
{
StringBuffer sb = new StringBuffer();
for (int i = 0; i < strList.size(); i++)
{
String line = strList.get(i);
sb.append(line + "\r\n");
}
return sb.toString().trim();
}
/**
* 这里看怎么替换就行了, lz可以按照自己的意愿替换
* @param line
* @param repalceLine
* @return
*/
private String processLine(String line, String repalceLine)
{
return repalceLine;
}
/**
* @param args
*/
public static void main(String[] args) {
new BookFileProcessor("in.txt", "out.txt"); }
/*替换的子串,可以单个,也可以整行, 我这里为了简便,整行替换,单个替换也是一个道理*/
private final String repalceStr = "我的书名 我的作者 我的书价 我的出版社 我的ISBN 我的打折 ";}
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
/**
* 普通的文本文件读取与写入操作
*
*/
public class NormalFileProcesser {
/**
* 文件的每一行保存为ArrayList
* @param filePath
* @return
*/
public static List<String> getStringFromFile(String filePath)
{
try {
List<String> arr = new ArrayList<String>();
BufferedReader in = new BufferedReader(new FileReader(filePath));
if(!new File(filePath).exists())
{
return null;
}
while (in.ready()) {
String line = in.readLine().trim();
if (line.length() != 0)
{
arr.add(line);
}
}
in.close();
return arr;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 保存文本文件
* @param filePath
* @param content
*/
public static void setContentToFile(String filePath, String content)
{
try {
File file = new File(filePath);
file.createNewFile();
FileOutputStream fo = new FileOutputStream(filePath);
PrintWriter pw = new PrintWriter(new File(filePath));
pw.write(content);
fo.close();
pw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
动不动就拿xml来完,此题明显普通文本更有解析的优势,何必搞dom,sax呢?
谢谢你,但是你可能误解了我的问题。例如输入:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
书名 著译者 价钱 出版地 ISBN号
c++ X 100 A 123
书名 作者 价钱 出版社 ISBN号
java Y 33 B 234那么输出应该是:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
java Y 33 B 234
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60%
java文件package test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;public class Test { public static void main(String[] args) {
Test test = new Test();
try {
test.readFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} public void readFile() throws FileNotFoundException, UnsupportedEncodingException {
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt"), "GBK"));
BufferedWriter bw = null;
boolean isTitle = true;
List titles = null;
List datas = null; try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"), "GBK"));
writeTitle(bw); while (bf.ready()) {
if (isTitle) {
titles = split(bf.readLine(), "[ ]+");
isTitle = false;
} else {
datas = split(bf.readLine(), "[ ]+");
isTitle = true;
} if (isTitle) {
System.out.println(titles);
System.out.println(datas);
writeData(bw, titles, datas);
}
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } public void writeTitle(BufferedWriter bw) throws IOException { // 30 20 10 30 10 5
String t1 = "图书名";
String t2 = "作者";
String t3 = "书价";
String t4 = "出版社";
String t5 = "ISBN";
String t6 = "打折";
String t = format(t1, 30) + format(t2, 20) + format(t3, 10)+ format(t4, 30) + format(t5, 10) + format(t6, 5)+"\n";
System.out.println(t);
bw.write(t);
} public void writeData(BufferedWriter bw, List titles, List datas)
throws IOException {
String title = "";
String[] ts1 = { "图书名", "书名", "丛书名" };
String[] ts2 = { "作者", "作者名", "著译者" };
String[] ts3 = { "书价", "价钱", "单价" };
String[] ts4 = { "出版社", "出版处", "出版地" };
String[] ts5 = { "ISBN", "ISBN号" };
String[] ts6 = { "打折" };
int i = 0;
// 1
for (i = 0; i < ts1.length; i++) {
if (titles.contains(ts1[i])) {
title += format(datas.get(titles.indexOf(ts1[i])).toString(), 30);
break;
}
}
if (i >= ts1.length) {
title += format("", 30);
}
// 2
for (i = 0; i < ts2.length; i++) {
if (titles.contains(ts2[i])) {
title += format(datas.get(titles.indexOf(ts2[i])).toString(), 20);
break;
}
}
if (i >= ts2.length) {
title += format("", 20);
}
//3
for (i = 0; i < ts3.length; i++) {
if (titles.contains(ts3[i])) {
title += format(datas.get(titles.indexOf(ts3[i])).toString(), 10);
break;
}
}
if (i >= ts3.length) {
title += format("", 10);
}
//4
for (i = 0; i < ts4.length; i++) {
if (titles.contains(ts4[i])) {
title += format(datas.get(titles.indexOf(ts4[i])).toString(), 30);
break;
}
}
if (i >= ts4.length) {
title += format("", 30);
}
//5
for (i = 0; i < ts5.length; i++) {
if (titles.contains(ts5[i])) {
title += format(datas.get(titles.indexOf(ts5[i])).toString(), 10);
break;
}
}
if (i >= ts5.length) {
title += format("", 10);
}
//6
for (i = 0; i < ts6.length; i++) {
if (titles.contains(ts6[i])) {
title += format(datas.get(titles.indexOf(ts6[i])).toString(), 5);
break;
}
}
if (i >= ts6.length) {
title += format("", 5);
}
title+="\n";
System.out.println(title);
bw.write(title);
} public String format(String t, int count) {
while (t.getBytes().length < count) {
t += " ";
}
return t;
} public List split(String text, String regex){
List result = new ArrayList();
if(null !=text){
if(regex==null || regex.equals("")){
result.add(text);
}else{
String[] d = text.split(regex);
for (int i = 0; i < d.length; i++) {
result.add(d[i]);
}
}
}
return result;
}}
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60%
这样的输入,输入应该是:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
java Y 101 B 234 98%
C Z 11 V 345
RUBY 30 X 60%
好像输出问题很大,呵呵,还是谢谢
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60%
package test;import java.io.Serializable;public class Textbean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String a;//图书名
private String b;//作者
private String c;//书价
private String d;//出版社
private String e;//ISBN
private String f;//打折
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
public String getD() {
return d;
}
public void setD(String d) {
this.d = d;
}
public String getE() {
return e;
}
public void setE(String e) {
this.e = e;
}
public String getF() {
return f;
}
public void setF(String f) {
this.f = f;
}
}package test;import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;public class TestReadtxt {
public static void main(String args[]){
List<String []> list1 = new ArrayList<String []>();//装入书的字段
List<String []> list2 = new ArrayList<String []>();//装入书的属性
List<Textbean> list3 = new ArrayList<Textbean>();//装入调整后书的属性
String s="";
String ss[]=null;
String sa[]=null;
String sb[]=null;
BufferedReader is=null;
String path="F:\\1.txt";
FileReader fr;
try {
fr = new FileReader(path);
is=new BufferedReader(fr);
while((s=is.readLine())!=null){
ss=s.split(" ");
if (ss[0].equals("图书名")||ss[0].equals("书名")||ss[0].equals("丛书名")) {
list1.add(ss);
}else{
list2.add(ss);
}
}
is.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < list1.size(); i++) {
Textbean text=new Textbean();
ss=list1.get(i);
sa=list2.get(i);
for (int j = 0; j <ss.length; j++) {
text.setA(" ");
if (ss[j].equals("图书名")||ss[j].equals("书名")||ss[j].equals("丛书名")) {
text.setA(sa[j]);
break;
}
}
for (int j = 0; j <ss.length; j++) {
text.setB(" ");
if (ss[j].trim().equals("作者名")||ss[j].trim().equals("作者")||ss[j].trim().equals("著译者")) {
text.setB(sa[j]);
break;
}
}
for (int j = 0; j <ss.length; j++) {
text.setC(" ");
if (ss[j].equals("书价")||ss[j].equals("单价")||ss[j].equals("价钱")) {
text.setC(sa[j]);
break;
}
}
for (int j = 0; j <ss.length; j++) {
text.setD(" ");
if (ss[j].equals("出版社")||ss[j].equals("出版处")||ss[j].equals("出版地")) {
text.setD(sa[j]);
break;
}
}
for (int j = 0; j <ss.length; j++) {
text.setE(" ");
if (ss[j].equals("ISBN")||ss[j].equals("ISBN号")||ss[j].equals("ISbn")) {
text.setE(sa[j]);
break;
}
}
for (int j = 0; j <ss.length; j++) {
text.setF(" ");
if (ss[j].equals("打折")) {
System.out.println(sa[j]);
text.setF(sa[j]);
break;
}
}
list3.add(text);
}
System.out.println("图书名\t作者\t书价\t出版社\tISBN\t打折 ");
for (int i = 0; i < list3.size(); i++) {
Textbean text=list3.get(i);
System.out.print(text.getA()+"\t");
System.out.print(text.getB()+"\t");
System.out.print(text.getC()+"\t");
System.out.print(text.getD()+"\t");
System.out.print(text.getE()+"\t");
System.out.println(text.getF()+"\t");
}
}
}
//得到的数据
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
c++ X 100 A 123
java Y 101 B 234 98%
C Z 11 V 345
RUBY 30 X 60%
取得话 显得用replace一下多个空格为一个空格
改一下就好了, 为什么不读一下代码呢? 修改如下:
package bookReader;import java.util.ArrayList;
import java.util.List;public class BookFileProcessor { public BookFileProcessor(String inTextFile, String outTextFile) {
List<String> inStrList = NormalFileProcesser
.getStringFromFile(inTextFile);
List<String> outStrList = processList(inStrList, repalceStr);
String outContent = listToString(outStrList);
NormalFileProcesser.setContentToFile(outTextFile, outContent);
} private List<String> processList(List<String> inStrList, String replace) {
List<String> resultList = new ArrayList<String>();
resultList.add(replace);
for (int i = 0; i < inStrList.size(); i++) {
if (i % 2 != 0) {
/* 去掉偶数列 */
String line = inStrList.get(i);
resultList.add(line);
}
}
return resultList;
} private String listToString(List<String> strList) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < strList.size(); i++) {
String line = strList.get(i);
sb.append(line + "\r\n");
}
return sb.toString().trim();
} /**
* @param args
*/
public static void main(String[] args) { new BookFileProcessor("in.txt", "out.txt"); } /* 这个完全由LZ自己拼装 */
private final String repalceStr = "我的书名 我的作者 我的书价 我的出版社 我的ISBN 我的打折 ";}下面的没有修改package bookReader;import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;/**
* 普通的文本文件读取与写入操作
*
*/
public class NormalFileProcesser { /**
* 文件的每一行保存为ArrayList
*
* @param filePath
* @return
*/
public static List<String> getStringFromFile(String filePath) {
try {
List<String> arr = new ArrayList<String>();
BufferedReader in = new BufferedReader(new FileReader(filePath));
if (!new File(filePath).exists()) {
return null;
}
while (in.ready()) {
String line = in.readLine().trim();
if (line.length() != 0) {
arr.add(line);
}
}
in.close();
return arr;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 保存文本文件
*
* @param filePath
* @param content
*/
public static void setContentToFile(String filePath, String content) {
try {
File file = new File(filePath);
file.createNewFile();
FileOutputStream fo = new FileOutputStream(filePath);
PrintWriter pw = new PrintWriter(new File(filePath));
pw.write(content);
fo.close();
pw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
你重复的数据没处理,别的没问题了
你重复的数据也没处理,呵呵
兄弟, 我给你思路如何?处理重复数据方法如下:目前是通过NormalFileProcesser 类将in.txt文件每一行读成一个List<String>,所谓重复数据的处理, 就是判断List中是否存在数据, 存在则不添加这一行,所以呢, 但是判断两行相等没有特别好的方法, 因此,你要吧List<String>这个结构改造一下, 改造成List<BookStructure>,BookStructure把每一行的数据转化为其属性,书名,折扣等等, 然后实现equals和hashcode方法,这样就可以用List的Contains方法,判断是否有相同行的存在,试一下,对你会有帮助,如果还是不明白如何下手,我去公司再帮你补充一下, 代码量在20行之内。
c++ XX 101 AB 123 QQ价格; 出版社; 书价;ISBN都相同吗?是不是ISBN相同就OK呢?Thanks!
c++ XX 101 AB 123 QQ这个不算重复但是下面的算重复!
c++ X 100 A 123 95%
c++ 100 A 95%
c++ 100 A 95% 另外, 文件中如果缺失某个字段,如bsnd号码,是留一个空格还是不留?文件格式你再详细讲解一下吧!
========================
有的一些信息不全。
另外, 文件中如果缺失某个字段,如bsnd号码,是留一个空格还是不留?
======================================================
要留的。格式都要对其!某些确实的信息空格补齐你原来的程序运行以后格式不齐先谢啦
C Z V 345 10%
书名 著译者 出版社 打折
C Z V 10%
=================================
这2条算重复的书名 著译者 出版社 ISBN 打折
C Z V 345 10%
书名 著译者 出版社 ISBN 打折
C Z V 345 22%
=======================================
这2条不重复
package test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;public class Test { public static void main(String[] args) {
Test test = new Test();
try {
test.readFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} public void readFile() throws FileNotFoundException, UnsupportedEncodingException {
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt"), "GBK"));
BufferedWriter bw = null;
boolean isTitle = true;
List titles = null;
List datas = null;
List allData = new ArrayList();
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"), "GBK"));
writeTitle(bw); while (bf.ready()) {
if (isTitle) {
titles = split(bf.readLine(), "[ ]+");
isTitle = false;
} else {
datas = split(bf.readLine(), "[ ]+");
isTitle = true;
} if (isTitle) {
System.out.println(titles);
System.out.println(datas);
List data = makeData(titles, datas);
if (check(allData, data)) {
allData.add(data);
writeData(bw, data);
}
}
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
public boolean check(List allData, List cData) {
int i = 0;
for (i = 0; i < allData.size(); i++) {
List oData = (List) allData.get(i);
for (int j = 0; j < oData.size(); j++) {
if (oData.get(i).toString().trim().equals("") || cData.get(i).toString().trim().equals("")) {
continue;
} else {
if (!oData.get(i).toString().trim().equals(cData.get(i).toString().trim())) {
return true;
}
}
}
}
if (i == 0) {
return true;
} else {
return false;
}
} public void writeTitle(BufferedWriter bw) throws IOException { // 30 20 10 30 10 5
String t1 = "图书名";
String t2 = "作者";
String t3 = "书价";
String t4 = "出版社";
String t5 = "ISBN";
String t6 = "打折";
String t = format(t1, 30) + format(t2, 20) + format(t3, 10)+ format(t4, 30) + format(t5, 10) + format(t6, 5)+"\n";
System.out.println(t);
bw.write(t);
} public List makeData(List titles, List datas) {
List list = new ArrayList();
String title = "";
String[] ts1 = { "图书名", "书名", "丛书名" };
String[] ts2 = { "作者", "作者名", "著译者" };
String[] ts3 = { "书价", "价钱", "单价" };
String[] ts4 = { "出版社", "出版处", "出版地" };
String[] ts5 = { "ISBN", "ISBN号" };
String[] ts6 = { "打折" };
int i = 0;
String temp = "";
// 1
for (i = 0; i < ts1.length; i++) {
if (titles.contains(ts1[i])) {
temp = format(datas.get(titles.indexOf(ts1[i])).toString(), 30);
break;
}
}
if (i >= ts1.length) {
temp = format("", 30);
}
list.add(temp);
title+=temp;
// 2
for (i = 0; i < ts2.length; i++) {
if (titles.contains(ts2[i])) {
temp = format(datas.get(titles.indexOf(ts2[i])).toString(), 20);
break;
}
}
if (i >= ts2.length) {
temp = format("", 20);
}
list.add(temp);
title+=temp;
//3
for (i = 0; i < ts3.length; i++) {
if (titles.contains(ts3[i])) {
temp = format(datas.get(titles.indexOf(ts3[i])).toString(), 10);
break;
}
}
if (i >= ts3.length) {
temp = format("", 10);
}
list.add(temp);
title+=temp;
//4
for (i = 0; i < ts4.length; i++) {
if (titles.contains(ts4[i])) {
temp = format(datas.get(titles.indexOf(ts4[i])).toString(), 30);
break;
}
}
if (i >= ts4.length) {
temp = format("", 30);
}
list.add(temp);
title+=temp;
//5
for (i = 0; i < ts5.length; i++) {
if (titles.contains(ts5[i])) {
temp = format(datas.get(titles.indexOf(ts5[i])).toString(), 10);
break;
}
}
if (i >= ts5.length) {
temp = format("", 10);
}
list.add(temp);
title+=temp;
//6
for (i = 0; i < ts6.length; i++) {
if (titles.contains(ts6[i])) {
temp = format(datas.get(titles.indexOf(ts6[i])).toString(), 5);
break;
}
}
if (i >= ts6.length) {
temp = format("", 5);
}
list.add(temp);
title+=temp;
title+="\n";
System.out.println(title);
return list;
}
public void writeData(BufferedWriter bw, List list) throws IOException {
String data = "";
for (int i = 0; i < list.size(); i++) {
data+=list.get(i).toString();
}
bw.write(data+"\n");
} public String format(String t, int count) {
while (t.getBytes().length < count) {
t += " ";
}
return t;
} public List split(String text, String regex){
List result = new ArrayList();
if(null !=text){
if(regex==null || regex.equals("")){
result.add(text);
}else{
String[] d = text.split(regex);
for (int i = 0; i < d.length; i++) {
result.add(d[i]);
}
}
}
return result;
}}
你的代码没处理重复的数据书名 著译者 出版社 ISBN 打折
C Z V 345 10%
书名 著译者 出版社 打折
C Z V 10%
=================================
这2条算重复的 书名 著译者 出版社 ISBN 打折
C Z V 345 10%
书名 著译者 出版社 ISBN 打折
C Z V 345 22%
=======================================
这2条不重复
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60%
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 著译者 出版社 ISBN 打折
C Z V 345 10%
书名 著译者 出版社 打折
C Z V 10%
书名 著译者 出版社 ISBN 打折
C Z V 345 22%
你的输出:图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
java Y 101 B 98%
C Z 11 V 345
RUBY 30 X 60%
c++ X 100 A 123 95%
C Z V 345 10%
C Z V 10%
C Z V 345 22% 红色的2条应该算是重复的,呵呵
先谢谢你的回复
这么重要的信息,你不说,怎么做啊还有字段之间的对其, 每个是不是要占固定的几个字节?c++ X 100 A 123 95%
第一段占9,第二段占9,第三段占9,第四段占7....等等这都没有说明白,晕了,不想做了
package test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;public class Test { public static void main(String[] args) {
Test test = new Test();
try {
test.readFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} public void readFile() throws FileNotFoundException, UnsupportedEncodingException {
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt"), "GBK"));
BufferedWriter bw = null;
boolean isTitle = true;
List titles = null;
List datas = null;
List allData = new ArrayList();
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"), "GBK"));
writeTitle(bw); while (bf.ready()) {
if (isTitle) {
titles = split(bf.readLine(), "[ ]+");
isTitle = false;
} else {
datas = split(bf.readLine(), "[ ]+");
isTitle = true;
} if (isTitle) {
System.out.println(titles);
System.out.println(datas);
List data = makeData(titles, datas);
if (check(allData, data)) {
writeData(bw, data);
}
allData.add(data);
}
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
public boolean check(List allData, List cData) {
int i = 0;
for (i = 0; i < allData.size(); i++) {
List oData = (List) allData.get(i);
for (int j = 0; j < oData.size(); j++) {
if (oData.get(j).toString().trim().equals("") || cData.get(j).toString().trim().equals("")) {
continue;
} else {
if (!oData.get(j).toString().trim().equals(cData.get(j).toString().trim())) {
return true;
}
}
}
}
if (i == 0) {
return true;
} else {
return false;
}
} public void writeTitle(BufferedWriter bw) throws IOException { // 30 20 10 30 10 5
String t1 = "图书名";
String t2 = "作者";
String t3 = "书价";
String t4 = "出版社";
String t5 = "ISBN";
String t6 = "打折";
String t = format(t1, 30) + format(t2, 20) + format(t3, 10)+ format(t4, 30) + format(t5, 10) + format(t6, 5)+"\n";
System.out.println(t);
bw.write(t);
} public List makeData(List titles, List datas) {
List list = new ArrayList();
String title = "";
String[] ts1 = { "图书名", "书名", "丛书名" };
String[] ts2 = { "作者", "作者名", "著译者" };
String[] ts3 = { "书价", "价钱", "单价" };
String[] ts4 = { "出版社", "出版处", "出版地" };
String[] ts5 = { "ISBN", "ISBN号" };
String[] ts6 = { "打折" };
int i = 0;
String temp = "";
// 1
for (i = 0; i < ts1.length; i++) {
if (titles.contains(ts1[i])) {
temp = format(datas.get(titles.indexOf(ts1[i])).toString(), 30);
break;
}
}
if (i >= ts1.length) {
temp = format("", 30);
}
list.add(temp);
title+=temp;
// 2
for (i = 0; i < ts2.length; i++) {
if (titles.contains(ts2[i])) {
temp = format(datas.get(titles.indexOf(ts2[i])).toString(), 20);
break;
}
}
if (i >= ts2.length) {
temp = format("", 20);
}
list.add(temp);
title+=temp;
//3
for (i = 0; i < ts3.length; i++) {
if (titles.contains(ts3[i])) {
temp = format(datas.get(titles.indexOf(ts3[i])).toString(), 10);
break;
}
}
if (i >= ts3.length) {
temp = format("", 10);
}
list.add(temp);
title+=temp;
//4
for (i = 0; i < ts4.length; i++) {
if (titles.contains(ts4[i])) {
temp = format(datas.get(titles.indexOf(ts4[i])).toString(), 30);
break;
}
}
if (i >= ts4.length) {
temp = format("", 30);
}
list.add(temp);
title+=temp;
//5
for (i = 0; i < ts5.length; i++) {
if (titles.contains(ts5[i])) {
temp = format(datas.get(titles.indexOf(ts5[i])).toString(), 10);
break;
}
}
if (i >= ts5.length) {
temp = format("", 10);
}
list.add(temp);
title+=temp;
//6
for (i = 0; i < ts6.length; i++) {
if (titles.contains(ts6[i])) {
temp = format(datas.get(titles.indexOf(ts6[i])).toString(), 5);
break;
}
}
if (i >= ts6.length) {
temp = format("", 5);
}
list.add(temp);
title+=temp;
title+="\n";
System.out.println(title);
return list;
}
public void writeData(BufferedWriter bw, List list) throws IOException {
String data = "";
for (int i = 0; i < list.size(); i++) {
data+=list.get(i).toString();
}
bw.write(data+"\n");
} public String format(String t, int count) {
while (t.getBytes().length < count) {
t += " ";
}
return t;
} public List split(String text, String regex){
List result = new ArrayList();
if(null !=text){
if(regex==null || regex.equals("")){
result.add(text);
}else{
String[] d = text.split(regex);
for (int i = 0; i < d.length; i++) {
result.add(d[i]);
}
}
}
return result;
}}
也就是 (书的定价)P*M(打折率) 只要不相等 就算不重复 对吗 LZ?
c++ X 100 A 123 95%
java Y 101 B 98%
C Z 11 V 345
RUBY 30 X 60%
c++ X 100 A 123 95%
C Z V 345 10%
C Z V 345 22%
这2条记录完全一样,但是你没去掉重复的1条
对你的代码,我的测试输入:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 作者 价钱 出版社 ISBN号
c++ X 100 A 123
丛书名 作者名 单价 出版处 ISbn 打折
java Y 101 B 234 98%
书名 著译者 价钱 出版地 ISBN号
C Z 11 V 345
丛书名 单价 出版处 打折
RUBY 30 X 60%
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
书名 著译者 出版社 ISBN 打折
C Z V 345 10%
书名 著译者 出版社 打折
C Z V 10%
书名 著译者 出版社 ISBN 打折
C Z V 345 22%
得到的输出:
图书名 作者 书价 出版社 ISBN 打折
c++ X 100 A 123 95%
java Y 101 B 98%
C Z 11 V 345
RUBY 30 X 60%
c++ X 100 A 123 95%
C Z V 345 10%
C Z V 10%
C Z V 345 22% 第1和第5重复,第6和第7也是重复的
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;public class Test { public static void main(String[] args) {
Test test = new Test();
try {
test.readFile();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} public void readFile() throws FileNotFoundException, UnsupportedEncodingException {
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt"), "GBK"));
BufferedWriter bw = null;
boolean isTitle = true;
List titles = null;
List datas = null;
List allData = new ArrayList();
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"), "GBK"));
writeTitle(bw); while (bf.ready()) {
if (isTitle) {
titles = split(bf.readLine(), "[ ]+");
isTitle = false;
} else {
datas = split(bf.readLine(), "[ ]+");
isTitle = true;
} if (isTitle) {
System.out.println(titles);
System.out.println(datas);
List data = makeData(titles, datas);
if (check(allData, data)) {
allData.add(data);
writeData(bw, data);
}
}
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
public boolean check(List allData, List cData) {
int i = 0;
for (i = 0; i < allData.size(); i++) {
List oData = (List) allData.get(i);
boolean flg = false;
for (int j = 0; j < oData.size(); j++) {
if (cData.get(j).toString().trim().equals("")) {
continue;
} else {
if (oData.get(j).toString().trim().equals(cData.get(j).toString().trim())) {
flg = true;
} else {
flg = false;
break;
}
}
}
if (flg) {
return false;
}
}
return true;
} public void writeTitle(BufferedWriter bw) throws IOException { // 30 20 10 30 10 5
String t1 = "图书名";
String t2 = "作者";
String t3 = "书价";
String t4 = "出版社";
String t5 = "ISBN";
String t6 = "打折";
String t = format(t1, 30) + format(t2, 20) + format(t3, 10)+ format(t4, 30) + format(t5, 10) + format(t6, 5)+"\n";
System.out.println(t);
bw.write(t);
} public List makeData(List titles, List datas) {
List list = new ArrayList();
String title = "";
String[] ts1 = { "图书名", "书名", "丛书名" };
String[] ts2 = { "作者", "作者名", "著译者" };
String[] ts3 = { "书价", "价钱", "单价" };
String[] ts4 = { "出版社", "出版处", "出版地" };
String[] ts5 = { "ISBN", "ISBN号" };
String[] ts6 = { "打折" };
int i = 0;
String temp = "";
// 1
for (i = 0; i < ts1.length; i++) {
if (titles.contains(ts1[i])) {
temp = format(datas.get(titles.indexOf(ts1[i])).toString(), 30);
break;
}
}
if (i >= ts1.length) {
temp = format("", 30);
}
list.add(temp);
title+=temp;
// 2
for (i = 0; i < ts2.length; i++) {
if (titles.contains(ts2[i])) {
temp = format(datas.get(titles.indexOf(ts2[i])).toString(), 20);
break;
}
}
if (i >= ts2.length) {
temp = format("", 20);
}
list.add(temp);
title+=temp;
//3
for (i = 0; i < ts3.length; i++) {
if (titles.contains(ts3[i])) {
temp = format(datas.get(titles.indexOf(ts3[i])).toString(), 10);
break;
}
}
if (i >= ts3.length) {
temp = format("", 10);
}
list.add(temp);
title+=temp;
//4
for (i = 0; i < ts4.length; i++) {
if (titles.contains(ts4[i])) {
temp = format(datas.get(titles.indexOf(ts4[i])).toString(), 30);
break;
}
}
if (i >= ts4.length) {
temp = format("", 30);
}
list.add(temp);
title+=temp;
//5
for (i = 0; i < ts5.length; i++) {
if (titles.contains(ts5[i])) {
temp = format(datas.get(titles.indexOf(ts5[i])).toString(), 10);
break;
}
}
if (i >= ts5.length) {
temp = format("", 10);
}
list.add(temp);
title+=temp;
//6
for (i = 0; i < ts6.length; i++) {
if (titles.contains(ts6[i])) {
temp = format(datas.get(titles.indexOf(ts6[i])).toString(), 5);
break;
}
}
if (i >= ts6.length) {
temp = format("", 5);
}
list.add(temp);
title+=temp;
title+="\n";
System.out.println(title);
return list;
}
public void writeData(BufferedWriter bw, List list) throws IOException {
String data = "";
for (int i = 0; i < list.size(); i++) {
data+=list.get(i).toString();
}
bw.write(data+"\n");
} public String format(String t, int count) {
while (t.getBytes().length < count) {
t += " ";
}
return t;
} public List split(String text, String regex){
List result = new ArrayList();
if(null !=text){
if(regex==null || regex.equals("")){
result.add(text);
}else{
String[] d = text.split(regex);
for (int i = 0; i < d.length; i++) {
result.add(d[i]);
}
}
}
return result;
}}