JDK6的新特性之十三:JTable的排序和过滤 原来的JTable基本上是只能显示数据,在JDK6新增了对JTable的排序和过滤功能,下面代码演示了这两个功能public class JTableTester { static String data[][] = { {"China","Beijing","Chinese"}, {"America","Washington","English"}, {"Korea","Seoul","Korean"}, {"Japan","Tokyo","Japanese"}, {"France","Paris","French"}, {"England","London","English"}, {"Germany","Berlin","German"}, }; static String titles[] = {"Country","Capital","Language"}; public static void main(String[] args) { DefaultTableModel m = new DefaultTableModel(data,titles); JTable t = new JTable(m); final TableRowSorter sorter = new TableRowSorter(m); t.setRowSorter(sorter); //为JTable设置排序器
JScrollPane sPane = new JScrollPane(); sPane.setViewportView(t);
JPanel p = new JPanel(); p.setLayout(new BoxLayout(p,BoxLayout.X_AXIS)); JLabel l = new JLabel("Criteria:"); final JTextField tf = new JTextField(); JButton b = new JButton("Do Filter"); p.add(l); p.add(tf); p.add(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(tf.getText().length()==0){ sorter.setRowFilter(null); }else{ sorter.setRowFilter(RowFilter.regexFilter(tf.getText()));//为JTable设置基于正则表达式的过滤条件 } } });
JFrame f = new JFrame("JTable Sorting and Filtering"); f.getContentPane().add(sPane,BorderLayout.CENTER); f.getContentPane().add(p,BorderLayout.SOUTH); f.setSize(400,300); f.setVisible(true); } }
先谢谢lsd,可是我们公司的jdk是1.4的。1.6的方法不能用。
定义一个比较器,用比较器排序,JTable的数据模型不要用二维数组,最好用动态数组ArrayList或者Vectorimport java.util.ArrayList; import java.util.Collections; import java.util.Comparator;public class A { public static void main(String[] args) { ArrayList<int[]> a = new ArrayList<int[]>(); a.add(new int[] { 3, 2 }); a.add(new int[] { 1, 2 }); a.add(new int[] { 4, 2 }); a.add(new int[] { 7, 2 }); a.add(new int[] { 2, 2 }); System.out.println("原数组:"); print(a); Collections.sort(a, new MyCom()); System.out.println("升序:"); print(a); Collections.sort(a, new MyCom2()); System.out.println("降序:"); print(a); } static void print(ArrayList<int[]> a) { for (int i = 0; i < a.size(); i++) { for (int j = 0; j < a.get(i).length; j++) { System.out.print(a.get(i)[j] + " "); } System.out.println(); } } }class MyCom implements Comparator<int[]> {//以第一列升序 public int compare(int[] o1, int[] o2) { return o1[0] - o2[0]; } }class MyCom2 implements Comparator<int[]> {//以第一列降序 public int compare(int[] o1, int[] o2) { return o2[0] - o1[0]; } }
还可以把两个比较器合并 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator;public class A { public static void main(String[] args) { ArrayList<int[]> a = new ArrayList<int[]>(); a.add(new int[] { 3, 2 }); a.add(new int[] { 1, 2 }); a.add(new int[] { 4, 2 }); a.add(new int[] { 7, 2 }); a.add(new int[] { 2, 2 }); System.out.println("原数组:"); print(a); Collections.sort(a, new MyCom(0)); System.out.println("升序:"); print(a); Collections.sort(a, new MyCom(1)); System.out.println("降序:"); print(a); } static void print(ArrayList<int[]> a) { for (int i = 0; i < a.size(); i++) { for (int j = 0; j < a.get(i).length; j++) { System.out.print(a.get(i)[j] + " "); } System.out.println(); } } }class MyCom implements Comparator<int[]> {//以第一列升序 int type; public int compare(int[] o1, int[] o2) { return type == 0 ? o1[0] - o2[0] : o2[0] - o1[0]; } public MyCom(int type) { this.type = type; } }
就两重循环,不能再快了吧有一种替代的方法就是实际不倒,但通过自己写一个访问函数就可以了,如:
int getItem(int[][] array, int row, int col){
return array[row][array[row].length - col-1];
}
for(int j;;)
getItem(array,i,j);
所以要找一个优化点的算法。
原来的JTable基本上是只能显示数据,在JDK6新增了对JTable的排序和过滤功能,下面代码演示了这两个功能public class JTableTester {
static String data[][] = {
{"China","Beijing","Chinese"},
{"America","Washington","English"},
{"Korea","Seoul","Korean"},
{"Japan","Tokyo","Japanese"},
{"France","Paris","French"},
{"England","London","English"},
{"Germany","Berlin","German"},
};
static String titles[] = {"Country","Capital","Language"};
public static void main(String[] args) {
DefaultTableModel m = new DefaultTableModel(data,titles);
JTable t = new JTable(m);
final TableRowSorter sorter = new TableRowSorter(m);
t.setRowSorter(sorter); //为JTable设置排序器
JScrollPane sPane = new JScrollPane();
sPane.setViewportView(t);
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p,BoxLayout.X_AXIS));
JLabel l = new JLabel("Criteria:");
final JTextField tf = new JTextField();
JButton b = new JButton("Do Filter");
p.add(l);
p.add(tf);
p.add(b);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(tf.getText().length()==0){
sorter.setRowFilter(null);
}else{
sorter.setRowFilter(RowFilter.regexFilter(tf.getText()));//为JTable设置基于正则表达式的过滤条件
}
}
});
JFrame f = new JFrame("JTable Sorting and Filtering");
f.getContentPane().add(sPane,BorderLayout.CENTER);
f.getContentPane().add(p,BorderLayout.SOUTH);
f.setSize(400,300);
f.setVisible(true);
}
}
import java.util.Collections;
import java.util.Comparator;public class A {
public static void main(String[] args) {
ArrayList<int[]> a = new ArrayList<int[]>();
a.add(new int[] { 3, 2 });
a.add(new int[] { 1, 2 });
a.add(new int[] { 4, 2 });
a.add(new int[] { 7, 2 });
a.add(new int[] { 2, 2 });
System.out.println("原数组:");
print(a);
Collections.sort(a, new MyCom());
System.out.println("升序:");
print(a);
Collections.sort(a, new MyCom2());
System.out.println("降序:");
print(a);
} static void print(ArrayList<int[]> a) {
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a.get(i).length; j++) {
System.out.print(a.get(i)[j] + " ");
}
System.out.println();
}
}
}class MyCom implements Comparator<int[]> {//以第一列升序
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
}class MyCom2 implements Comparator<int[]> {//以第一列降序
public int compare(int[] o1, int[] o2) {
return o2[0] - o1[0];
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class A {
public static void main(String[] args) {
ArrayList<int[]> a = new ArrayList<int[]>();
a.add(new int[] { 3, 2 });
a.add(new int[] { 1, 2 });
a.add(new int[] { 4, 2 });
a.add(new int[] { 7, 2 });
a.add(new int[] { 2, 2 });
System.out.println("原数组:");
print(a);
Collections.sort(a, new MyCom(0));
System.out.println("升序:");
print(a);
Collections.sort(a, new MyCom(1));
System.out.println("降序:");
print(a);
} static void print(ArrayList<int[]> a) {
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a.get(i).length; j++) {
System.out.print(a.get(i)[j] + " ");
}
System.out.println();
}
}
}class MyCom implements Comparator<int[]> {//以第一列升序
int type; public int compare(int[] o1, int[] o2) {
return type == 0 ? o1[0] - o2[0] : o2[0] - o1[0];
} public MyCom(int type) {
this.type = type;
}
}
第二、提高搜索准确性,专业的中文分词;
第三,智能分析关键词,纠错,相关词提取等;
第四、方法搜索 关键词的关系(与 或 非)等;