Du bist nicht angemeldet.

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

1

20.08.2011, 01:05

Vergleicher

Moin.
Hier ist ein Programm, dass aufgrud dieses Threads entstanden ist.

Es geht darum, dass 2 Texte verglichen werden und zwar im Bezug auf die Zahlen, die darin vorkommen. Wenn sich 2 Zahlen unterscheiden, soll diese Zahl gehighlightet werden, in dem Fall fettgedruckt, kann man aber leicht ändern (CSS).

Es ist sogar nur eine Klasse geworden (mit einer inneren Klasse), knapp 170 Zeilen:

Spoiler Spoiler


Comparer.java

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;


public class Comparer extends JFrame {

	private static final long serialVersionUID = 1L;
	static final String PRE_HTML 		 = "<html><style> .wrong_number { font-weight: bold; } </style></head><body>";
	static final String POST_HTML 		 = "</body></html>";
	static final String PRE_NUMBER_HTML  = "<span class='wrong_number'>";
	static final String POST_NUMBER_HTML = "</span>";
	
	JTextArea text1Area;
	JTextArea text2Area;
	JEditorPane comparedArea;

	public static void main(String[] args) {
		new Comparer();
	}
	
	public static void loadFileToTextArea(JTextArea textArea, File file) {
		//Läd den Inhalt von file und schreibt ihn nach textArea.
		if(file.exists() && file.canRead() && file.isFile()) {
			try {
				BufferedReader reader = new BufferedReader(new FileReader(file));
				StringBuffer buffer = new StringBuffer();
				String line = reader.readLine();
				while(line != null) {
					buffer.append(line + "\n");
					line = reader.readLine();
				}
				textArea.setText(buffer.toString());
			} catch(Exception e) {}
		}
	}
	
	public static void loadFileToTextArea(JTextArea textArea) {
		//Wenn kein File als Parameter übergeben wird, 
		//wird ein File durch einen Dateiauswahldialog ausgewählt.
		JFileChooser chooser = new JFileChooser(System.getProperty("user.home"));
		int state = chooser.showOpenDialog(null); 
		if (state == JFileChooser.APPROVE_OPTION) { 
			loadFileToTextArea(textArea, chooser.getSelectedFile());
		} 
	}
	
	public static String compare(String text1, String text2) {
		Vector<String>  text1Numbers = new Vector<String>();
		Vector<String>  text2Numbers = new Vector<String>();
		Vector<Integer> text2NumberLocations = new Vector<Integer>();
		
		//Zahlen aus text1 speichern
		for(int i = 0; i < text1.length(); i++) {
			if(Character.isDigit(text1.charAt(i))) {
				int j = i;
				while(j+1 < text1.length() && Character.isDigit(text1.charAt(j+1))) {
					j++;
				}
				text1Numbers.add(text1.substring(i, j+1));
				i = j;
			}
		}
		String compared = new String(text2); //text2 kopieren, damit man nicht nur eine Referenz hat
		compared = compared.replaceAll("<", "&lt;").replaceAll(">", "&gt;"); //Bugfix, falls man den Vergleicher für HTML-Code benutzt
		compared = compared.replaceAll(" ", "&nbsp;").replaceAll("\\\t", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"); //Whitespaces rekonstruieren
		compared = compared.replaceAll("\\\n", "<br />"); //Zeilenumbrüche wieder darstellen
		//Zahlen aus text2 speichern
		for(int i = 0; i < compared.length(); i++) {
			if(Character.isDigit(compared.charAt(i))) {
				int j = i;
				while(j+1 < compared.length() && Character.isDigit(compared.charAt(j+1))) {
					j++;
				}
				text2Numbers.add(compared.substring(i, j+1));
				text2NumberLocations.add(i);
				i = j;
			}
		}
		//Zahlen vergleichen, wenn verschieden in text2 highlighten
		int offset = 0; //Durchs HTML ändern sich die Positionen der Zahlen
		for(int i = 0; i < text2Numbers.size(); i++) {
			//Sind die Zahlen verschieden, oder ist sie in text1 garnicht vorhanden?
			if(text1Numbers.size() <= i || !text1Numbers.elementAt(i).equals(text2Numbers.elementAt(i))) {
				String before;
				String after;
				//Text vor und hinter der Zahl abschneiden
				if(text2NumberLocations.elementAt(i) != 0) {
					before = compared.substring(0, text2NumberLocations.elementAt(i)+offset);
				} else {
					before = "";
				}
				if(text2NumberLocations.elementAt(i)+text2Numbers.elementAt(i).length() != compared.length()) {
					after = compared.substring(text2NumberLocations.elementAt(i)+text2Numbers.elementAt(i).length()+offset);
				} else {
					after = "";
				}
				compared = before + PRE_NUMBER_HTML + text2Numbers.elementAt(i) + POST_NUMBER_HTML + after;
				offset += PRE_NUMBER_HTML.length() + POST_NUMBER_HTML.length();
			}
		}
		return PRE_HTML + compared + POST_HTML;
	}
	
	public Comparer() {
		//Kontruktor (erzeugt das Fenster)
		this.setSize(800, 600);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((d.width - getSize().width) / 2, (d.height - getSize().height) /2);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setTitle("Text Vergleicher by Erik");
		
		this.getContentPane().setLayout(new GridLayout(1, 3));
		
		JPanel text1Container = new JPanel();
		text1Container.setLayout(new BorderLayout());
		text1Container.setBorder(new TitledBorder("Text 1"));
		this.text1Area = new JTextArea();
		text1Container.add(new JScrollPane(this.text1Area), BorderLayout.CENTER);
		JButton text1Button = new JButton("Text 1 aus Datei laden...");
		text1Button.addActionListener(new Listener(this));
		text1Container.add(text1Button, BorderLayout.SOUTH);
		this.getContentPane().add(text1Container);
		
		JPanel text2Container = new JPanel();
		text2Container.setLayout(new BorderLayout());
		text2Container.setBorder(new TitledBorder("Text 2"));
		this.text2Area = new JTextArea();
		text2Container.add(new JScrollPane(this.text2Area), BorderLayout.CENTER);
		JButton text2Button = new JButton("Text 2 aus Datei laden...");
		text2Button.addActionListener(new Listener(this));
		text2Container.add(text2Button, BorderLayout.SOUTH);
		this.getContentPane().add(text2Container);
		
		JPanel comparedContainer = new JPanel();
		comparedContainer.setLayout(new BorderLayout());
		comparedContainer.setBorder(new TitledBorder("Verglichen"));
		this.comparedArea = new JEditorPane();
		this.comparedArea.setContentType("text/html");
		comparedContainer.add(new JScrollPane(this.comparedArea), BorderLayout.CENTER);
		JButton comparedButton = new JButton("Vergleichen");
		comparedButton.addActionListener(new Listener(this));
		comparedContainer.add(comparedButton, BorderLayout.SOUTH);
		this.getContentPane().add(comparedContainer);
		
		this.setVisible(true);
	}
	
	final class Listener implements ActionListener {
		//Eventhandler für die Buttons in der GUI
		Comparer compRef;
		public Listener(Comparer comp) {
			this.compRef = comp;
		}
		public void actionPerformed(ActionEvent e) {
			if(e.getActionCommand().equals("Text 1 aus Datei laden...")) {
				loadFileToTextArea(this.compRef.text1Area);
			} else if(e.getActionCommand().equals("Text 2 aus Datei laden...")) {
				loadFileToTextArea(this.compRef.text2Area);
			} else {
				this.compRef.comparedArea.setText(compare(this.compRef.text1Area.getText(), this.compRef.text2Area.getText()));
			}
		}
	}
	
}



Keine Ahnung, wofür man das brauch :D
Ich habs programmiert, um zu programmieren und nicht, um hinterher das Programm zu haben :)

Ist meinetwegen jetzt WTFLP oder gleich Public Domain...

So, also ich bin froh, dass ichs hinter mir hab, war echt ne Herausforderung am Ende :D
Für Fragen oder Anregungen bin ich immer offen. Testen wäre auch nett.

EDIT: Formatierung ist hier net so geil, ich lad nochmal Src hoch.
»Erik« hat folgende Dateien angehängt:
  • Comparer.jar (4,75 kB - 105 mal heruntergeladen - zuletzt: Gestern, 23:04)
  • Comparer.java (6,66 kB - 153 mal heruntergeladen - zuletzt: 17.10.2018, 05:52)
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

DanielBocksteger

unregistriert

2

20.08.2011, 09:50

Das ist dochmal was :)



Ich würde noch an die enden der Beiden Textfelder für Texte an das ende jeder zeile einen Zeilenumbruch setzen. Da immoment alles in eine Zeile getippt wird wenn man plan durch schreibt.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DanielBocksteger« (20.08.2011, 10:11)


Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

3

20.08.2011, 10:50

Ja ich wusste nicht, ob das bei längeren Texten besser ist, wenn die automatisch umbrechen, oder wenn man horizontal scrollen kann...
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

4

20.08.2011, 11:04

Ich würde es mit Zeilenumbruch machen, aber auch die Boxen untereinander anordnen, so das sie breite und dafür halt niedriger sind. Sonst wird das zu unübersichtlich.
Signatur ?

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

5

20.08.2011, 11:20

Warum bin ich da eigentlich net drauf gekommen :D
Hab auf Cedis Bild aufgebaut, aber untereinander wäre irgendwie schlauer :D

Hätte das sonst so gemacht, dass man die grenzen zwischen den Textfeldern so hin und her ziehen kann, kp wie das jetzt heißt :D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

cedi

Profi

Beiträge: 702

Danksagungen: 78

  • Private Nachricht senden

6

20.08.2011, 13:58

hey, geil :D

aber von OOP hast auch noch nichts gehört xD
die Main Methode, die GUI und das vergleichen in einer Klasse xD

verbesserst du das jetzt nochmal, oder bleibt das deine endgültige Version?

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

7

21.08.2011, 16:59

Im gegensatz zu deinem Programm ist das korektes OOP.
Ob die innere Klasse soviel Sinn mach, ok, darüber kann man streiten, hab ich aber so gelernt und beibehalten.

ABER: Das Programm wird durch die Klasse Comparer repräsentiert, welche von JFRame abgeleitet wird und somit auch dass einzige fenster darstellt.
Natürlich hat die Comparer Klasse dann auch statische Methoden wie compare(). Ok, für Sachen wie Text in ein TextArea laden könnte man eine komplett statische Utility-Klasse machen, man kann es aber auch übertreiben ;)

joa und mehr methoden gibts da auch net :D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

8

21.08.2011, 18:24

Also mehr Trennung aka MVC wäre schon sinnvoll gewesen.

Wenn man jetzt eine Konsolenfassung von deiner Software schreiben wollte, würde man alles nochmal schreiben müsste, oder zumindest in dem Code rumpfuschen.

Wäre eine Trennung vorhanden, dann hätte man nur eine Vergleicher-Klasse instanzieren müssten, welche dann zurück gibt, was unterschiedlich ist.
Und diese Rückgabe hätte dann jeder so verarbeiten können wie er will.
Die GUI z.B. mit 3 Textboxen, die Konsole durch Ausgaben, etc ;)

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

9

21.08.2011, 20:20

MVC ist total overkill bei sonem kleinen programm.
Außerdem geht das ja, man kann ja die statische Methode Comparer.compare() auch in einer Konsolenversion verwenden...
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

10

21.08.2011, 20:23

MVC ist nicht overkill. Das wären nur nen paar Zeilen mehr und alles in nen paar Klassen aufgespaltet gewesen.
Und durch die nicht Trennung hätte man dann in dem Programm den ganzen GUI Code, welcher überhaupt nicht benötigt wird und das nur, weil man zu faul war, ne 2. Klasse zu erstellen.

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

11

21.08.2011, 20:27

Ich finde es besser, dass nicht zu stark aufzuteilen... Das Programm wird nciht weiterentwickelt. Außerdem soll es auch nur mit GUI sein.
Ganz ehrlich, so ein Programm brauch eh niemand -.-'
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Simon

Profi

Beiträge: 725

Registrierungsdatum: 14.06.2011

Danksagungen: 210

  • Private Nachricht senden

12

21.08.2011, 20:29

Das habe ich nie behauptet :D:D
War auch nur als Tipp, denn bei vielen Projekten ist es einfach sehr nützlich und spart haufenweise Zeit ;)

Erik

Profi

  • »Erik« ist der Autor dieses Themas

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

13

21.08.2011, 21:33

Ja MVC ist ja auch ne feine Sache, aber in dem Fall unnötig :D Finde ich zummindest. Kannst des Prog ja weiterentwickeln und verkaufen :/
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Ähnliche Themen

Verwendete Tags

Comparer, Java, Vergleicher