在网上看到了一个小程序,修改了其中的bug(主要是没有关闭一些InputStreamReader之类的东西)
修改为可以查找重复字符串,不仅仅是手机号.测试了一个文件,50万条带重复字符串的文件(每行一串字符,是移动的号段表)耗时 2515毫秒,实际效率应该比这个低,因为号段已经排过序了.
代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Vector;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;


/** *//**
*
*
*
* @author
* @modify hallywang 2006-11-18
*
*/


public class Main extends javax.swing.JFrame ...{


/** *//**
*
*/
private static final long serialVersionUID = 1L;

private Vector vectors = new Vector();

String[] resultArr = null;


/** *//** Creates new form Main */


public Main() ...{

initComponents();

this.setSize(405, 400);

this.setTitle("电话号码查询");

this.setResizable(false);

}


/** *//**
* This method is called from within the constructor to
*
* initialize the form.
*
* WARNING: Do NOT modify this code. The content of this method is
*
* always regenerated by the Form Editor.
*
*/

// //GEN-BEGIN:initComponents

private void initComponents() ...{

jFileChooser1 = new JFileChooser();

desktopPane = new javax.swing.JDesktopPane();

jPanel1 = new javax.swing.JPanel();

jScrollPane1 = new javax.swing.JScrollPane();

jScrollPane2 = new javax.swing.JScrollPane();

jTextArea1 = new javax.swing.JTextArea();

jTextArea2 = new javax.swing.JTextArea();

menuBar = new javax.swing.JMenuBar();

fileMenu = new javax.swing.JMenu();

openMenuItem = new javax.swing.JMenuItem();

saveMenuItem = new javax.swing.JMenuItem();

saveAsMenuItem = new javax.swing.JMenuItem();

exitMenuItem = new javax.swing.JMenuItem();

editMenu = new javax.swing.JMenu();

cutMenuItem = new javax.swing.JMenuItem();

copyMenuItem = new javax.swing.JMenuItem();

pasteMenuItem = new javax.swing.JMenuItem();

deleteMenuItem = new javax.swing.JMenuItem();

helpMenu = new javax.swing.JMenu();

contentMenuItem = new javax.swing.JMenuItem();

aboutMenuItem = new javax.swing.JMenuItem();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jPanel1.setLayout(new java.awt.BorderLayout());

jTextArea1.setColumns(35);

jTextArea1.setRows(15);

jTextArea1.setTabSize(4);

jScrollPane1.setViewportView(jTextArea1);

jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);

jTextArea2.setColumns(35);

jTextArea2.setRows(5);

jScrollPane2.setViewportView(jTextArea2);

jPanel1.add(jScrollPane2, java.awt.BorderLayout.SOUTH);

jPanel1.setBounds(0, 0, 400, 280);

desktopPane.add(jPanel1, javax.swing.JLayeredPane.DEFAULT_LAYER);

getContentPane().add(desktopPane, java.awt.BorderLayout.CENTER);

fileMenu.setText("文件");


fileMenu.addActionListener(new java.awt.event.ActionListener() ...{


public void actionPerformed(java.awt.event.ActionEvent evt) ...{

fileMenuActionPerformed(evt);

}

});

openMenuItem.setText("打开");


openMenuItem.addActionListener(new java.awt.event.ActionListener() ...{


public void actionPerformed(java.awt.event.ActionEvent evt) ...{

openMenuItemActionPerformed(evt);

}

});

fileMenu.add(openMenuItem);

saveMenuItem.setText("保存");


saveMenuItem.addActionListener(new java.awt.event.ActionListener() ...{


public void actionPerformed(java.awt.event.ActionEvent evt) ...{

saveMenuItemActionPerformed(evt);

}

});

fileMenu.add(saveMenuItem);

// saveAsMenuItem.setText("Save As ...");

// fileMenu.add(saveAsMenuItem);

exitMenuItem.setText("Exit");


exitMenuItem.addActionListener(new java.awt.event.ActionListener() ...{


public void actionPerformed(java.awt.event.ActionEvent evt) ...{

exitMenuItemActionPerformed(evt);

}

});

fileMenu.add(exitMenuItem);

menuBar.add(fileMenu);

editMenu.setText("Edit");

cutMenuItem.setText("Cut");

editMenu.add(cutMenuItem);

copyMenuItem.setText("Copy");

editMenu.add(copyMenuItem);

pasteMenuItem.setText("Paste");

editMenu.add(pasteMenuItem);

deleteMenuItem.setText("Delete");

editMenu.add(deleteMenuItem);

menuBar.add(editMenu);

helpMenu.setText("Help");

contentMenuItem.setText("Contents");

helpMenu.add(contentMenuItem);

aboutMenuItem.setText("About");


aboutMenuItem.addActionListener(new java.awt.event.ActionListener() ...{


public void actionPerformed(java.awt.event.ActionEvent evt) ...{

aboutMenuItemActionPerformed(evt);

}

});

helpMenu.add(aboutMenuItem);

menuBar.add(helpMenu);

setJMenuBar(menuBar);

pack();

}

// //GEN-END:initComponents


private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) ...{// GEN-FIRST:event_aboutMenuItemActionPerformed

// TODO 将在此处添加您的处理代码:

JOptionPane.showMessageDialog(null, "Find Phone Num by repeated.",
"关于", JOptionPane.WARNING_MESSAGE);

}// GEN-LAST:event_aboutMenuItemActionPerformed


private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) ...{// GEN-FIRST:event_openMenuItemActionPerformed

String strFileOpen = "";

String lineStr = null;

StringBuffer sbf = new StringBuffer();

StringBuffer bf2 = new StringBuffer();

String[] stringArr = null;

// jFileChooser1 =new JFileChooser();


try ...{

if (JFileChooser.APPROVE_OPTION == this.jFileChooser1

.showOpenDialog(this)) ...{

strFileOpen = this.jFileChooser1.getSelectedFile().getPath();

this.setTitle(strFileOpen);
long stime = System.currentTimeMillis();

try ...{

File files = new File(strFileOpen.toString());

vectors.removeAllElements();

InputStreamReader read = new InputStreamReader(
new FileInputStream(files), "gb2312");

// BufferedReader br=new BufferedReader(new
// FileReader(filepath.toString()));

BufferedReader br = new BufferedReader(read);


while ((lineStr = br.readLine()) != null) ...{

// returnStr=returnStr+line+" ";

// line=br.readLine();

// 处理字符并添加到向量中
if (lineStr.trim().equals(""))// 去掉回车和空格
continue;
else
vectors.add(new String(lineStr).trim());

// sbf.append(" ");

}

read.close();
br.close();

stringArr = new String[vectors.size()];

resultArr = new String[vectors.size()];

vectors.copyInto(stringArr);

Arrays.sort(stringArr);// 关键

int startIndex = 1;

resultArr[0] = stringArr[0];
sbf.append(resultArr[0] + " ");
// System.out.println(resultArr[0]+":"+intArr[0]);


for (int j = 1; j < stringArr.length; j++) ...{
// System.out.println(resultArr[startIndex-1]+":"+intArr[j]);


if (resultArr[startIndex - 1].equals(stringArr[j])) ...{

bf2.append(stringArr[j] + " ");

}


else ...{

sbf.append(stringArr[j] + " ");

resultArr[startIndex] = stringArr[j];

startIndex++;

}

// startIndex++;

}
PrintWriter output = null;
String newfile = strFileOpen.substring(0, strFileOpen
.lastIndexOf("."))
+ "new"
+ strFileOpen.substring(strFileOpen
.lastIndexOf("."));
output = new PrintWriter(newfile);


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

if (resultArr[i] != null) ...{

output.write(resultArr[i] + " ");

}

}
output.close();
System.out.println("耗时:"
+ (System.currentTimeMillis() - stime) + "毫秒");

// jTextArea1.setText("处理后的结果为: " + sbf.toString());

jTextArea2.setText("处理后无重复文件保存到: " + newfile);

}


catch (IOException e) ...{

System.out.println("file open error" + e.getMessage());

}

// this.statubar.setText("Open File:"+this.filename);

}

else


...{

return;

}

}


catch (Exception e) ...{

// this.statubar.setText("Error Open:"+e.getMessage());

}

}// GEN-LAST:event_openMenuItemActionPerformed


private void saveMenuItemActionPerformed(java.awt.event.ActionEvent evt) ...{// GEN-FIRST:event_openMenuItemActionPerformed

File fileName = null;

String strFileOpen = null;

PrintWriter output = null;


try ...{

if (JFileChooser.APPROVE_OPTION == this.jFileChooser1

.showSaveDialog(this)) ...{

strFileOpen = this.jFileChooser1.getSelectedFile().getPath();

this.setTitle(strFileOpen);

fileName = jFileChooser1.getSelectedFile();

this.setTitle("保存至:" + fileName.getName());


try ...{

output = new PrintWriter(fileName);


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

if (resultArr[i] != null) ...{

output.write(resultArr[i] + " ");

}

}

jTextArea1.setText("成功保存至: " + strFileOpen);

}


catch (IOException e) ...{

}


finally ...{

output.close();

output = null;

}

}

}


catch (Exception e) ...{

}

}// GEN-LAST:event_openMenuItemActionPerformed


private void fileMenuActionPerformed(java.awt.event.ActionEvent evt) ...{// GEN-FIRST:event_fileMenuActionPerformed

// TODO 将在此处添加您的处理代码:

}// GEN-LAST:event_fileMenuActionPerformed


private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) ...{// GEN-FIRST:event_exitMenuItemActionPerformed

System.exit(0);

}// GEN-LAST:event_exitMenuItemActionPerformed

// 交换位置


private void swap(int loc1, int loc2) ...{

Object tmp = vectors.elementAt(loc1);

vectors.setElementAt(vectors.elementAt(loc2), loc1);

vectors.setElementAt(tmp, loc2);

}


/** *//**
*
* @param args
* the command line arguments
*
*/


public static void main(String args[]) ...{


java.awt.EventQueue.invokeLater(new Runnable() ...{


public void run() ...{

new Main().setVisible(true);

}

});

}

private javax.swing.JFileChooser jFileChooser1;

// 变量声明 - 不进行修改//GEN-BEGIN:variables

protected javax.swing.JMenuItem aboutMenuItem;

protected javax.swing.JMenuItem contentMenuItem;

protected javax.swing.JMenuItem copyMenuItem;

protected javax.swing.JMenuItem cutMenuItem;

protected javax.swing.JMenuItem deleteMenuItem;

protected javax.swing.JDesktopPane desktopPane;

protected javax.swing.JMenu editMenu;

protected javax.swing.JMenuItem exitMenuItem;

protected javax.swing.JMenu fileMenu;

protected javax.swing.JMenu helpMenu;

protected javax.swing.JPanel jPanel1;

protected javax.swing.JScrollPane jScrollPane1;

protected javax.swing.JScrollPane jScrollPane2;

protected javax.swing.JTextArea jTextArea1;

protected javax.swing.JTextArea jTextArea2;

protected javax.swing.JMenuBar menuBar;

protected javax.swing.JMenuItem openMenuItem;

protected javax.swing.JMenuItem pasteMenuItem;

protected javax.swing.JMenuItem saveAsMenuItem;

protected javax.swing.JMenuItem saveMenuItem;

// 变量声明结束//GEN-END:variables

}
