This commit is contained in:
Johannes Schmelz 2025-06-04 18:25:35 +02:00
parent ac9d7fdd39
commit 701e732eb6
10 changed files with 484 additions and 0 deletions

View File

@ -0,0 +1,63 @@
package doc;
import java.util.List;
import java.util.ArrayList;
public class Book{
private String title;
private String author;
private List<TextComponent> contents;
public Book(String author, String title, List<TextComponent> contents){
this.title = title;
this.author = author;
this.contents = contents;
}
public int countWords(){
Section helpSection = new Section("help", contents);
return helpSection.countWords();
}
public int countWordsByVisitor(){
CountWordsVisitor countWords = new CountWordsVisitor();
int wordCount = 0;
for(TextComponent i : contents){
wordCount += i.accept(countWords);
}
return wordCount;
}
public List<String> tableOfContents(){
TableOfContentsVisitor contentTable = new TableOfContentsVisitor();
List<String> returnedContent = new ArrayList<String>();
for(TextComponent e : contents){
//contentTable.setPrefix(Integer.toString(itteration));
List<String> returned = e.accept(contentTable);
if(returned != null){
returnedContent.addAll(returned);
}
}
return returnedContent;
}
public String toText(){
StringBuilder st = new StringBuilder();
ToTextVisitor textVisitor = new ToTextVisitor();
st.append(" ");
st.append(author);
st.append("\n");
st.append(title);
st.append("\n\n");
for(TextComponent i : contents){
st.append(i.accept(textVisitor));
st.append("\n");
}
return st.toString();
}
}

View File

@ -0,0 +1,148 @@
package doc;
import java.util.List;
public class BookDemo {
private static final String TEXT0 = "Über Entwurf und Realisierung eierlegender Wollmilchsäue.";
private static final String TEXT1 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod " +
"tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. " +
"At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd " +
"gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum " +
"dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor " +
"invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.";
private static final String TEXT2 = "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie " +
"consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan " +
"et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis " +
"dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer " +
"adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore " +
"magna aliquam erat volutpat.";
private static final String TEXT3 = "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit " +
"lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure " +
"dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore " +
"eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim " +
"qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla " +
"facilisi.";
private static final String TEXT4 = "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming " +
"id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, " +
"consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet " +
"dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud " +
"exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo " +
"consequat.";
private static final String TEXT5 = "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie " +
"consequat, vel illum dolore eu feugiat nulla facilisis.";
private static final String TEXT6 = "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, " +
"no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, " +
"consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et " +
"dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo " +
"duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est " +
"Lorem ipsum dolor sit amet.";
private static final String TEXT7 = "Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore " +
"et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et " +
"justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata " +
"sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur " +
"sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore " +
"magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo " +
"dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est " +
"Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing " +
"elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam " +
"erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea " +
"rebum. Stet clita kasd gubergren, no sea takimata sanctus.";
private static final String TEXT8 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " +
"eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam " +
"voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " +
"clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit " +
"amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " +
"nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed " +
"diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " +
"clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. ";
private static final String TEXT9 = "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie " +
"consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan " +
"et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis " +
"dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer " +
"adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore " +
"magna aliquam erat volutpat.";
private static final String TEXT10 = "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit " +
"lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure " +
"dolor in hendrerit in vulputate velit esse molestie consequat, vel illum " +
"dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio " +
"dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te " +
"feugait nulla facilisi.";
private static final String TEXT11 = "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet " +
"doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, " +
"consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut " +
"laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, " +
"quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex " +
"ea commodo";
private static final String TEXT12 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " +
"eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam " +
"voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " +
"clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit " +
"amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " +
"nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed " +
"diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet " +
"clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
private static final String TEXT13 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " +
"eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam " +
"voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita " +
"kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
private static final String TEXT14 = "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, " +
"no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit " +
"amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut " +
"labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam " +
"et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata " +
"sanctus est Lorem ipsum dolor sit amet.";
private static final String TEXT15 = "Lorem ipsum dolor sit amet, consetetur sadipscing " +
"elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et " +
"nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd " +
"magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum " +
"dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed " +
"diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
public static void main(String[] args) {
final Book book = makeBook();
// Aufgabe 1
System.out.println("Buch enthält " + book.countWords() + " Wörter");
// Aufgabe 2
System.out.println("Buch enthält " + book.countWordsByVisitor() + " Wörter");
System.out.println("Inhalt: " + book.tableOfContents());
System.out.println(book.toText());
}
private static Book makeBook() {
final Section sec1 = new Section("Einführung",
List.of(new Paragraph(TEXT1),
new Paragraph(TEXT2)));
final Section sec2 = new Section("Hintergrund",
List.of(new Paragraph(TEXT3),
new Section("Geschichte",
List.of(new Paragraph(TEXT4),
new Image("https://www.bekannt.de/p1.pdf",
"Bild 1"),
new Paragraph(TEXT5))),
new Section("Literatur",
List.of(new Paragraph(TEXT6),
new Image("https://www.eh-klar.de/p2.pdf",
"Bild 2"),
new Paragraph(TEXT7),
new Image("https://www.jeder-weiss-es.de/p3.pdf",
"Bild 3"),
new Paragraph(TEXT8)))));
final Section sec3 = new Section("Idee",
List.of(new Paragraph(TEXT9)));
final Section sec4 = new Section("Umsetzung",
List.of(new Paragraph(TEXT10),
new Section("Entwurf",
List.of(new Paragraph(TEXT11),
new Section("Grobentwurf",
List.of(new Paragraph(TEXT12))),
new Section("Feinentwurf",
List.of(new Paragraph(TEXT13))))),
new Section("Realisierung",
List.of(new Paragraph(TEXT14)))));
final Section sec5 = new Section("Zusammenfassung und Ausblick", List.of(new Paragraph(TEXT15)));
return new Book("Peter Mustermann", "Die eierlegende Wollmilchsau",
List.of(new Paragraph(TEXT0), sec1, sec2, sec3, sec4, sec5));
}
}

View File

@ -0,0 +1,38 @@
package doc;
import java.util.List;
public class CountWordsVisitor implements Visitor<Integer>{
public Integer visit(Paragraph e){
String text = e.getText();
int wordCount = 0;
boolean open = false;
for (char i : text.toCharArray()){
if(!open && Character.isAlphabetic(i)){
open = true;
}
else if(open && !Character.isAlphabetic(i)){
open = false;
wordCount++;
}
}
if (open){
open = false;
wordCount++;
}
return wordCount;
}
public Integer visit(Image e){
return 0;
}
public Integer visit(Section e){
List<TextComponent> contents = e.getContents();
int wordCount = 0;
for (TextComponent c: contents){
wordCount += c.accept(this);
}
return wordCount;
}
}

View File

@ -0,0 +1,29 @@
package doc;
public class Image implements TextComponent{
private String url;
private String caption;
public Image(String url, String caption) {
this.url = url;
this.caption = caption;
}
public int countWords(){
return 0;
}
public String getUrl(){
return url;
}
public String getCaption(){
return caption;
}
public <T> T accept(Visitor<T> v){
return v.visit(this);
}
}

View File

@ -0,0 +1,39 @@
package doc;
public class Paragraph implements TextComponent{
private String text;
public Paragraph(String text){
this.text = text;
}
public String getText(){
return text;
}
public int countWords(){
int wordCount = 0;
boolean open = false;
for(char i : text.toCharArray()){
if(!open && Character.isAlphabetic(i)){
open = true;}
else if(open && !Character.isAlphabetic(i)){
open = false;
wordCount ++;
}
}
if(open){
open = false;
wordCount++;
}
return wordCount;
}
public <T> T accept(Visitor<T> v){
return v.visit(this);
}
}

View File

@ -0,0 +1,35 @@
package doc;
import java.util.List;
public class Section implements TextComponent{
private String header;
private List<TextComponent> contents;
public Section(String header, List<TextComponent> contents){
this.header = header;
this.contents = contents;
}
public String getHeader(){
return header;
}
public List<TextComponent> getContents(){
return contents;
}
public int countWords(){
int wordCount = 0;
for(TextComponent i : contents){
wordCount = wordCount + i.countWords();
}
return wordCount;
}
public <T> T accept(Visitor<T> v){
return v.visit(this);
}
}

View File

@ -0,0 +1,77 @@
package doc;
import java.util.ArrayList;
import java.util.List;
public class TableOfContentsVisitor implements Visitor <List<String>>{
private String prefix = "1";
public TableOfContentsVisitor(){
}
public void setPrefix(String pre){
prefix = pre;
}
public List<String> visit(Paragraph e){
return null;
}
public List<String> visit(Image e){
return null;
}
/*public List<String> visit(Section e){
List<String> tabelOfContentsList = new ArrayList<String>();
List<TextComponent> copied = e.getContents();
String oldPrefix = prefix;
if(prefix.length() == 0){
tabelOfContentsList.add(prefix+ " " + e.getHeader());
}
else {
tabelOfContentsList.add(prefix + " " + e.getHeader());
}
int chapter = 1;
for(TextComponent i : e.getContents()){
String savedPrefix = prefix;
setPrefix(prefix + "." + Integer.toString(chapter));
List<String> returnedContent = i.accept(this);
if (returnedContent != null){
tabelOfContentsList.addAll(i.accept(this));
chapter++;
}
setPrefix(savedPrefix);
}
setPrefix(oldPrefix);
return tabelOfContentsList;
}*/
//Alternative die immer den aktuellen Stand übergibt und somit auf jeder "Ebene" ein eigener Visitor agiert
private int sectionCtr = 1;
public TableOfContentsVisitor(String prefix) {
this.prefix = prefix;
}
@Override
public List<String> visit(Section section) {
final List<String> list = new ArrayList<>();
sectionCtr++;
list.add(prefix + sectionCtr + " " + section.getHeader());
final TableOfContentsVisitor subVisitor =
new TableOfContentsVisitor(prefix + sectionCtr + ".");
for (TextComponent c : section.getContents())
list.addAll(c.accept(subVisitor));
return list;
}
}

View File

@ -0,0 +1,7 @@
package doc;
public interface TextComponent {
int countWords();
<T> T accept(Visitor<T> visitor);
}

View File

@ -0,0 +1,38 @@
package doc;
class ToTextVisitor implements Visitor<String> {
private final String prefix;
private int sectionCtr = 0;
private int imageCtr = 0;
public ToTextVisitor() {
this("");
}
public ToTextVisitor(String prefix) {
this.prefix = prefix;
}
@Override
public String visit(Paragraph section) {
return section.getText();
}
@Override
public String visit(Image image) {
imageCtr++;
final String num = prefix + imageCtr;
return "<image " + image.getUrl() + ">\nFig. " + num + ": " + image.getCaption();
}
@Override
public String visit(Section section) {
final StringBuilder b = new StringBuilder();
sectionCtr++;
b.append(prefix).append(sectionCtr).append(" ").append(section.getHeader());
final ToTextVisitor subVisitor = new ToTextVisitor(prefix + sectionCtr + ".");
for (TextComponent c : section.getContents())
b.append("\n\n").append(c.accept(subVisitor));
return b.toString();
}
}

View File

@ -0,0 +1,10 @@
package doc;
public interface Visitor<T> {
T visit(Image image);
T visit(Paragraph paragraph);
T visit(Section section);
// semantisch falsch
//T visit(TextComponent c);
}