Hallo zusammen,
ich hab 200 Text-Dateien, deren Größe von 1 kb bis zu 7 MB variieren.
In jeder dieser Dateien steht max. eine Zahl zwischen 1 und 1 Mio pro Zeile, also 1 Integer pro Zeile.
Mein Ziel war es nun, zu zählen, wie oft bspw. die 5 in diesen 200 Dateien vorkommt. An sich auch kein Problem, denn folgender Code tut ja auch was er soll, aber es dauert einfach ewig und mit ewig mein ich, dass nach 1 h gerade mal 3 Dateien eingelesen waren, die jeweils so ca. 3 MB groß waren - das schreiben selbst hat dagegen nur ca. 4 Sekunden gedauert...
Das Problem scheint ja nun irgendwie beim Überprüfen auf Vorhandensein zu liegen, also ab if(tmp.contains(zahl)), aber wie kann man das besser (also deutlich schneller) lösen? Gibt es besser geeignete Kollektoren dafür oder macht man sowas ganz anders?
Danke und Grüße,
muemmel_0811
ich hab 200 Text-Dateien, deren Größe von 1 kb bis zu 7 MB variieren.
In jeder dieser Dateien steht max. eine Zahl zwischen 1 und 1 Mio pro Zeile, also 1 Integer pro Zeile.
Mein Ziel war es nun, zu zählen, wie oft bspw. die 5 in diesen 200 Dateien vorkommt. An sich auch kein Problem, denn folgender Code tut ja auch was er soll, aber es dauert einfach ewig und mit ewig mein ich, dass nach 1 h gerade mal 3 Dateien eingelesen waren, die jeweils so ca. 3 MB groß waren - das schreiben selbst hat dagegen nur ca. 4 Sekunden gedauert...
Code:
public class CountingSeeds extends JFrame{
private static final long serialVersionUID = 1L;
Content cntnt = new Content();
CountingSeeds() {
super();
setTitle("Seed-Crawler");
setLayout(new BorderLayout());
getContentPane().add(cntnt, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initLaF();
}
public static void main(String[] args) {
CountingSeeds se = new CountingSeeds();
se.setSize(600,400);
se.setLocation(200,200);
se.setVisible(true);
}
private void initLaF() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
SwingUtilities.updateComponentTreeUI(cntnt);
}
catch(Exception c){
}
}
private class Content extends JPanel {
private static final long serialVersionUID = 1L;
JLabel lbl = new JLabel("Verzeichnis wählen");
JTextField txtDir = new JTextField();
JButton btn = new JButton("...");
JButton btn2 = new JButton("Go");
JTextArea ta = new JTextArea();
JScrollPane scr = new JScrollPane();
JProgressBar bar = new JProgressBar();
Content() {
double rand = 10.0;
double[][] size = {{rand,130,300,20,40,20,50,TableLayout.FILL},{rand,25,10,220,20,30,TableLayout.FILL,rand}};
setLayout(new TableLayout(size));
add(lbl, "1,1");
add(txtDir, "2,1");
btn.addActionListener(new GetDir());
add(btn, "4,1");
btn2.addActionListener(new DirScan());
add(btn2, "6,1");
scr.setViewportView(ta);
add(bar, "1,5,6,5");
add(scr, "1,3,6,3");
}
}
class GetDir implements ActionListener{
public void actionPerformed(ActionEvent ae) {
JFileChooser fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int option = fc.showOpenDialog(cntnt.txtDir);
if(option == JFileChooser.APPROVE_OPTION) {
String pfad = fc.getSelectedFile().getAbsolutePath();
cntnt.txtDir.setText(pfad);
}
}
}
private class DirScan implements ActionListener {
public void actionPerformed(ActionEvent ae) {
new Thread() {
public void run() {
try{
Thread.sleep(2000);
String x = cntnt.txtDir.getText();
boolean rek = true;
DirectoryScanner ds = new DirectoryScanner();
ds.setPfad(cntnt.txtDir.getText());
ds.setTypen(".txt");
ds.setRekursiv(rek);
ArrayList<File> dateien = ds.runDir();
such(dateien);
}
catch(Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
private void such(ArrayList<File> files) {
String zeile;
ArrayList<Integer> tmp = new ArrayList<Integer>();
HashMap<Integer, Integer> seed = new HashMap<Integer, Integer>();
for(File f : files) {
try {
BufferedReader rein = new BufferedReader(new FileReader(f));
cntnt.ta.append("Lese: " + f + "\n");
while((zeile = rein.readLine()) != null) {
System.out.println(zeile);
int zahl = Integer.parseInt(zeile);
if(tmp.contains(zahl)) {
Iterator it = seed.entrySet().iterator();
while(it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
int key = (Integer) e.getKey();
int val = (Integer) e.getValue();
if(key == zahl) {
val = val + 1;
seed.put(key, val);
}
}
}
else {
tmp.add(zahl);
seed.put(zahl, 1);
}
}
}
catch(Exception e) {
}
}
ausgabe(seed);
}
private void ausgabe(HashMap<Integer, Integer> hm) {
Iterator it = hm.entrySet().iterator();
int max = hm.size();
cntnt.bar.setMinimum(0);
cntnt.bar.setMaximum(max);
cntnt.bar.setValue(0);
cntnt.bar.setStringPainted(true);
try {
BufferedWriter raus = new BufferedWriter(new FileWriter("C:\\DATEN\\R\\result.txt"));
cntnt.ta.append("Schreibe result.txt\n\n");
raus.write("Seed\tAnzahl\n");
raus.newLine();
for(int i=0; i<=max; i++) {
final int a = i;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
cntnt.bar.setValue(a);
}
});
while(it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
int key = (Integer)e.getKey();
int val = (Integer)e.getValue();
raus.write(key + "\t" + val);
raus.newLine();
}
}
raus.close();
cntnt.ta.append("\n\nFertig");
}
catch(Exception e2) {
}
}
}
Das Problem scheint ja nun irgendwie beim Überprüfen auf Vorhandensein zu liegen, also ab if(tmp.contains(zahl)), aber wie kann man das besser (also deutlich schneller) lösen? Gibt es besser geeignete Kollektoren dafür oder macht man sowas ganz anders?
Danke und Grüße,
muemmel_0811