有一个va.txt文件内容如下:
12,33,46,56,654,3
794,4,3839,604,43,33
79,34,383,604,431,332
212,2,462,56,654,23
需要将内容读取到vb.txt文件中,并且将每行的顺序按升序排列,且要实现每列按升序排列,并且不能将每行的值换到别的行中,必须保留在本行中。如:
2,23,56,212,462,654
4,33,43,604,794,3839
12,33,46,56,654,3222
34,79,323,332,431,604
12,33,46,56,654,3
794,4,3839,604,43,33
79,34,383,604,431,332
212,2,462,56,654,23
需要将内容读取到vb.txt文件中,并且将每行的顺序按升序排列,且要实现每列按升序排列,并且不能将每行的值换到别的行中,必须保留在本行中。如:
2,23,56,212,462,654
4,33,43,604,794,3839
12,33,46,56,654,3222
34,79,323,332,431,604
解决方案 »
- 求救啊,在线等答案,一个stratsWith()方法问题
- Tomcat6.0.20 ActiveMQ 配置出错
- 最近要弄个CRM系统,想找一个开源的作二次开发 openCRX
- ssh2:saveOrUpdate时,怎么老是save啊?
- Axis wsdl2java 生成代码的问题
- myeclipse6.5执行junit时出错
- java线程中后台线程和普通的线程有什么区别?他的运行机制是什么?
- form表单,用ajax实现了两级级选择列表,但是提交给action时,接收的数据似乎是<option>的value值,真正要的值接收不到?如何解决
- 小弟想学习struts,请问在哪里下载struts包阿?
- 我是新手!请问:用JBuilder6.0开发应用程序之后,如何部署?请细说
- 咋样解决多人同时登录?
- Spring依赖注入
1.先读一行一行的读取va.txt,把每一行存到list1中。
2.每一行都有一个,号所有按,号截取成一个String数组并把此数组转换为int数组,并排序后组合成原来格式的字符串继续放到list2中
3.在2步中列排序做好了,然后写一个比较器类,用于行之间的排序返回一个List
4.得到第3步的list写入文件以下是代码: import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class OrderFileNumber { /**
* @param args
*/
public static void main(String[] args) {
OrderFileNumber ofn = new OrderFileNumber();
List<String> list = ofn.readFile("c:/va.txt");
List<String> orderList = ofn.sort(list);
ofn.writeFile("c:/vb.txt", orderList);
} /**
* 读取文件内容,并放在一个list中
*
* @param fileName
* 文件名
* @return
*/
public List<String> readFile(String fileName) {
List<String> list = null;
BufferedReader br = null;
try {
InputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is);
br = new BufferedReader(isr); // 得到一个bufferedReader
// 为了方便设用readLine()方法
list = new ArrayList<String>();
String str = null;
while ((str = br.readLine()) != null) {
list.add(str);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return list;
} /**
* 排序
*
* @param list
* readFile方法得到的list
* @return
*/
public List<String> sort(List<String> list) {
List<String> array = null;
if (list != null) {
array = new ArrayList<String>();
for (int i = 0; i < list.size(); i++) { // 循环list
String str = list.get(i);
String[] strs = str.split(","); // 按,号截取,注意楼主给出的逗号是中文状态下的
int[] ar = new int[strs.length];// new 一个int数组
for (int j = 0; j < strs.length; j++) { // 把string数组转换为int数组
ar[j] = Integer.parseInt(strs[j]);
}
Arrays.sort(ar); // 排 序int数组
String s = "";
for (int k = 0; k < ar.length; k++) { // 把数组重新组合成字符串楼主可以考虑用StringBuffer来拼接字符串
if (k != ar.length - 1) {
s = s + ar[k] + ",";
} else {
s = s + ar[k];
}
}
array.add(s);
Collections.sort(array, new MyComparator()); // 用下面的的内部类比较器排序
}
}
return array;
} /**
* 写文件
*
* @param fileName
* @param list
*/
public void writeFile(String fileName, List<String> list) {
BufferedWriter bw = null;
try {
OutputStream os = new FileOutputStream(fileName);
OutputStreamWriter osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
for (int i = 0; i < list.size(); i++) {
bw.write(list.get(i));
bw.newLine();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
* 创建内部类,用于每行之间的比较
*
* @author student
*
*/
public class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
String x = (String) o1;
String y = (String) o2;
String a = x.substring(0, x.indexOf(","));
String b = y.substring(0, y.indexOf(","));
if (Integer.parseInt(a) > Integer.parseInt(b)) {
return 1;
} else {
return -1;
}
} }
}
呵呵,又复习了一下以前的知识
import java.io.*;
public class MatrixSort{
public static void main(String[] args)throws Exception{
sortFile("va.txt");
}
public static void sortFile(String fileName) throws Exception{
Scanner scan=new Scanner(new FileInputStream(fileName));
ArrayList<List<String>> lines=new ArrayList<List<String>>();
String line=null;
//读文件内容到lines
//
while(scan.hasNext()){
line=scan.nextLine();
lines.add(Arrays.asList(line.split("[,,]\\s*")));
}
scan.close();
//对每一行排序:
//
for(List<String> oneLine:lines){
Collections.sort(oneLine,new Comparator<String>(){
public int compare(String str1,String str2){
int i1=Integer.parseInt(str1.trim());
int i2=Integer.parseInt(str2.trim());
return i1-i2;
}
public boolean equals(Object o){
return false;
}
});
} //按列排序:
//
Collections.sort(lines,new Comparator<List<String>>(){
public int compare(List<String> l1,List<String> l2){
int i1=Integer.parseInt(l1.get(0).trim());
int i2=Integer.parseInt(l2.get(0).trim());
return i1-i2;
}
public boolean equals(Object o){
return false;
}
}); //写文件:
//
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("vb.txt"),"UTF-8"));
for(List<String> li:lines){
line=(""+li);
line=line.substring(1,line.length()-1);
bw.write(line,0,line.length());
bw.newLine();
}
bw.flush();
bw.close();
}}
vb.txt内容如下:
2, 23 , 56, 212, 462, 654
3 , 12, 33, 46, 56, 654
4, 33 , 43, 604, 794, 3839
34, 79, 332 , 383, 431, 604
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class paixu
{
private String message[];
private int message3[][];
private int length;
public void read()
{
String filename="e:/va.txt";
try
{
BufferedReader read=new BufferedReader(new FileReader(filename));
message=new String[15];
String line;
int i=0;
line=read.readLine();
while(line!=null)
{
message[i]=line;
i++;
line=read.readLine();
}
read.close();
length=i;
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void change()
{
message3=new int[length][];
for(int i=0;i<length;i++)
{
String one=message[i].substring(0, message[i].length()-1);
String message2[]=one.split(",");
message3[i]=new int[message2.length];
for(int z=0;z<message2.length;z++)
{
message2[z].trim();
}
for(int j=0;j<message2.length;j++)
{
message3[i][j]=Integer.parseInt(message2[j]);
}
}
}
public void pai()
{
for(int i=0;i<message3.length;i++)
{
for(int j=0;j<message3[i].length;j++)
{
int k=j;
for(int z=j+1;z<message3[i].length;z++)
{
if(message3[i][z]<message3[i][k])
k=z;
}
if(k!=j)
{
int c;
c=message3[i][j];
message3[i][j]=message3[i][k];
message3[i][k]=c;
}
}
}
}
public void show()
{
for(int i=0;i<message3.length;i++)
{
for(int j=0;j<message3[i].length;j++)
System.out.print(message3[i][j]+" ");
System.out.println();
}
}
public static void main(String[] args)
{
paixu xuexi=new paixu();
xuexi.read();
xuexi.change();
xuexi.pai();
xuexi.show();
}
}
public void smallProgram() throws IOException{
File file = new File("src\\va.txt");
List<String> linesList = FileUtils.readLines(file);
List rows = new ArrayList<int[]>();
for(int i=0; i<linesList.size(); i++){
String[] noStrings = linesList.get(i).split(",");
int[] row = new int[noStrings.length];
for (int j = 0; j < noStrings.length; j++) {
row[j] = Integer.parseInt(noStrings[j].trim());
}
Arrays.sort(row);
rows.add(row);
}
System.out.println("====================================");
for (int j = 0; j < rows.size(); j++) {
for(int i=0; i<rows.size() - 1; i++){
int f1 = ((int[])rows.get(i))[0];
int f2 = ((int[])rows.get(i+1))[0];
if(f1 > f2){
int[] temp = (int[])rows.get(i);
rows.set(i, rows.get(i+1));
rows.set(i+1, temp);
}
}
}
System.out.println("====================================");
List<String> resultList = new ArrayList<String>();
for(int i=0; i<rows.size(); i++){
int[] ints = (int[]) rows.get(i);
StringBuffer line = new StringBuffer();
for (int j = 0; j < ints.length; j++) {
line.append(ints[j]);
if(j < ints.length-1){
line.append(",");
}
}
resultList.add(line.toString());
}
File toFile = new File("src\\vb.txt");
FileUtils.writeLines(toFile, "utf-8", resultList); }
我倒觉得你把功能分成一块一块的挺好的.
我的排序效率不高,是对字符串排序,规则是转成int比较大小,一个可能要转好多次。应该在排序之前都转为int比较好.
我觉得遇到此类问题需要分析一下,划分一下:
1.此题需要什么技术?简单文件读写操作、数据类型的常用操作,排序
2.这些技术自己都掌握么?
如果不会操作文件,看书,或是直接上网搜java读写txt的例子,配通运行,学习理解,最后改写,掌握
如果不会基本数据类型的常用操作,对不起,回头好好看看基础吧
如果不会排序,也上网查查吧,什么冒泡排序,插入排序,二分排序,网上例子一大堆,自己把例子复制 下来,运行一下,单步走几遍,就能理解了,真的不难
3.根据自己的情况一步步解决问题,不会排序,就先完成io部分,把va.txt读到内存中,尔后直接写出到vb.txt中,之后再去解决排序的问题。
楼主建议你自己解决此问题吧,只要努力了,真的不难。