📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / presentations / Programmieren-Tutorium / Tutorium-11 / tutorium-11.tex
132940 viewsLicense: OTHER
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}1\usepackage{../templates/myStyle}23\begin{document}4\title{\titleText}5\subtitle{Sortieren, equals(), hashCode(), abstrakte Klassen, finale Klassen}6\author{\tutor}7\date{\today}8\subject{Programmieren}910\frame{\titlepage}1112\frame{13\frametitle{Inhaltsverzeichnis}14\setcounter{tocdepth}{1}15\tableofcontents16\setcounter{tocdepth}{2}17}1819\section{Einleitung}20\subsection{Quiz}21\begin{frame}{Quiz}22\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{QuizMain.java}23\begin{itemize}24\item Gibt es einen Compiler-Fehler?25\item Gibt es einen Laufzeit-Fehler?26\item Gibt es eine Ausgabe? Welche?27\end{itemize}28\end{frame}2930\begin{frame}{Quiz: Antwort}31\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=7, firstline=7, lastline=19, ]{java}{QuizMain.java}32\begin{block}{Compiler-Fehler}33{\small34Exception in thread "main" java.lang.Error: Unresolved compilation problem:\\35Bound mismatch: The generic method \myCode{sort(List<T>)} of36type Collections is not applicable for the arguments37(\myCode{List<List<String$>>$}).\\38The inferred type \myCode{List<String>} is not a valid substitute for39the bounded parameter \myCode{<T extends Comparable<? super T$>>$}\\40at Main.main(Main.java:18)}41\end{block}42\end{frame}4344\subsection{Altes Übungsblatt}45\begin{frame}{Altes Übungsblatt}46\href{http://stackoverflow.com/q/14200941/562769}{Does it make sense to implement clone(), equals() or hashCode() for an abstract class?}4748\begin{block}{Answer}49I wouldn't implement clone().5051But it makes sense to implement \myCode{equals()},52\myCode{hashCode()}, and53\myCode{toString()} to provide the default behavior for all subclasses.54Children can choose to use it if they add no new class55members or supplement as needed.56\end{block}57\end{frame}5859\subsection{Generics}60\begin{frame}{Generics}61\begin{block}{Übungsleiter}62generics werden wir für die Abschlussaufgaben vermeiden.63\end{block}64\end{frame}6566\section{equals()}67\subsection{instanceof vs. getClass()}68\begin{frame}{instanceof vs. getClass()}69\begin{itemize}[<+->]70\item instanceof akzeptiert auf Untertypen:71\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=8, lastline=15]{java}{singleLines.java}72\item getClass nicht:73\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=17, lastline=18]{java}{singleLines.java}74\item[$\Rightarrow$] Bei \myCode{equals()} eher \myCode{getClass} verwenden75\item \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html\#jls-15.20.2}{instanceof} funktioniert auch mit \myCode{null}76\item \myCode{null.getClass()} gibt \myCode{NullPointerException} nicht77\item[$\Rightarrow$] zuerst auf \myCode{null} überprüfen78\end{itemize}79\end{frame}8081\begin{frame}{instanceof vs. getClass()}82Aber \dots83\begin{itemize}84\item \href{http://stackoverflow.com/q/596462/562769}{Sehr viele} ziehen \myCode{instanceof} in \myCode{equals()} der \myCode{getClass()}85Variante vor86\item Es gibt Argumente für beides87\begin{itemize}88\item pro-instanceof: Debug-Klassen89\item pro-instanceof: \href{http://en.wikipedia.org/wiki/Liskov_substitution_principle}{Liskov substitution principle}90\item pro-getClass(): Die Klassen stimmen wirklich überein91\end{itemize}92\item Achtung: Andere Semantik!93\end{itemize}94\end{frame}9596\section{Sortieren}97\subsection{Was kann man sortieren?}98\begin{frame}{Was kann man sortieren?}99\begin{itemize}100\item Zahlen101\item Wörter102\item Länder nach Anzahl der Einwohner103\item Spielkarten104\item \dots105\end{itemize}106\end{frame}107108\subsection{Was braucht man?}109\begin{frame}{Was braucht man?}110Totale Ordnungsrelation $\preceq$ auf einer Menge $C$:111\begin{itemize}112\item Totalität: $\forall x, y \in C: x \preceq y \lor y \preceq x$113\item Antisymmetrie: $\forall x,y \in C: x \preceq y \land y \preceq x \Rightarrow x = y$114\item Transitivität: $\forall x,y,z \in C: x \preceq y \land y \preceq z \Rightarrow x \preceq z$115\end{itemize}116\end{frame}117118\begin{frame}{Wo ist das nicht gegeben?}119\begin{itemize}120\visible<1->{\item Totalität: $\forall x, y \in C: x \preceq y \lor y \preceq x$?}121\visible<2->{\item[$\Rightarrow$] Menge $\mathbb{C}$, Relation $\leq$: $i$ und $1$ stehen nicht in Relation!}122\visible<2->{\item[$\Rightarrow$] Menge $\mathcal{P}(\Set{1,2,3})$, Relation $\subseteq$: $\Set{1}$ und $\Set{2}$ stehen nicht in Relation!}123\visible<3->{\item Antisymmetrie: $\forall x,y \in C: x \preceq y \land y \preceq x \Rightarrow x = y$?}124\visible<4->{\item[$\Rightarrow$] Menge $\mathbb{R}$, Relation $\preceq: x \preceq y \Leftrightarrow x,y \in \mathbb{R}$ (vgl. \href{http://math.stackexchange.com/q/276907/6876}{SO})}125\visible<5->{\item Transitivität: $\forall x,y,z \in C: x \preceq y \land y \preceq z \Rightarrow x \preceq z$?}126\visible<6->{\item[$\Rightarrow$] ?}127\end{itemize}128\end{frame}129130\begin{frame}{Hilfe, ich komme mit Relationen nicht zurecht!}131Don't Panic!132133\begin{itemize}134\item Meist vergleicht man indirekt Zahlen135\item[$\rightarrow$] Bei \myCode{double} und \myCode{float} den Epsilon-Vergleich machen!136\item Sonst vergleicht man Strings137\item[$\rightarrow$] \myCode{myString.compareTo(myOtherString)}138\item Die JavaDoc von \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html\#compareTo\%28T\%29}{compareTo(other)}139sind weniger mathematisch formuliert140\end{itemize}141\end{frame}142143\subsection{Wie sortiert man?}144\begin{frame}{Wie sortiert man?}145Vergleichsbasierte Sortieralgorithmen:146\begin{itemize}147\item Selectionsort148\item Bubblesort149\item Quicksort150\item \dots151\end{itemize}152153Nicht vergleichsbasierte Algorithmen:154\begin{itemize}155\item Radixsort156\item Countingsort157\end{itemize}158159Implementierungen und Vergleiche dieser und weiterer Algorithmen sind160\href{http://martin-thoma.com/ubersicht-uber-sortieralgorithmen/}{hier}161zu finden.162163\begin{block}{Info am Rande}164Collections.sort() verwendet Mergesort-Variante (vermutlich Timsort)165\end{block}166\end{frame}167168\subsection{Sortieren in Java}169\begin{frame}{Sortieren in Java: Arrays}170\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Arrays-sort.java}171\end{frame}172173\begin{frame}{Sortieren in Java: Collections}174\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Collection-sort.java}175\end{frame}176177\begin{frame}{Sortieren in Java: Comparator}178\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{PopulationDensityComperator.java}179\end{frame}180181\begin{frame}{Sortieren in Java: Comparator benutzen}182\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ComparatorMain.java}183\end{frame}184185\section{hashCode()}186\subsection{Allgemeines}187\begin{frame}{Vier Gewinnt}188\begin{block}{Frage}189Wie viele Situationen gibt es auf einem $7 \times 6$-Feld190bei "`4 Gewinnt"'?191\end{block}192193\begin{itemize}[<+->]194\item maximal: $3^{7 \cdot 6} = 3^{42} = 109418989131512359209 \approx 109 \cdot 10^{18}$195\item minimal: schwer zu sagen196\item Idee: Brute-Force197\begin{itemize}198\item Alle möglichen Spielentscheidungen durchgehen199\item Kommt man auf eine bereits bekannte Situation, ist es keine neue200\item Man muss also alte Situationen speichern (z.B. ein \myCode{char[42]} pro Spielsituation)201\item Man muss eine alte Situationen finden können202\item Vermutung: min. $20\,000\,000$ Spielsituationen203\item[$\Rightarrow$] lineare Suche nach bekannten Situationen dauert zu lange204\end{itemize}205\end{itemize}206\end{frame}207208\begin{frame}{Vier Gewinnt: Hashing}209\begin{block}{Frage}210Wie kann ich schnell eine Spielsituation speichern und wieder211finden?212\end{block}213214Antwort: Hash-Funktion mit linearer Sondierung!215216\pause217218\begin{itemize}[<+->]219\item Ich will eine Funktion: $h: \text{Spielsituationen} \rightarrow \text{Array-Index}$220\item Die Spiel-Situation kann ich als Zahl $x$ auffassen mit $0 \leq x \leq 110 \cdot 10^{18}$221\item Für den Array-Index $i$ gilt: $0 \leq i \le 20\,000\,000$222\item $h$ ist also nicht injektiv223\item Sobald der Array voll ist, können wir aufhören224\item Falls $h(x)$ ein Array-Index ist, der bereits belegt ist, aber der Array nicht voll ist, müssen wir225die nächste freie Stelle suchen.\\226Dazu gehen wir einfach auf $(h(x) + 1) \% 20\,000\,000$227\item[$\Rightarrow$] wird "`lineares Sondieren genannt"'228\end{itemize}229\end{frame}230231\begin{frame}{Vier Gewinnt: hash-Funktion}232\begin{block}{Frage}233Wie sieht eine gute hash-Funktion aus?234\end{block}235236\begin{itemize}[<+->]237\item Sie sollte surjektiv sein238\item Sie sollte gleichmäßig auf die Bildmenge abbilden239\item Vorschlag: \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{c}{vierGewinnt.c}240\item Beispiel-Code ist auf \href{https://github.com/MartinThoma/connect-four/blob/master/C/connectfour.c}{GitHub}241\end{itemize}242\end{frame}243244\begin{frame}{Hashing: Allgemein}245\begin{block}{Frage}246Was ist nun eine Hash-Funktion im Allgemeinen?247\end{block}248249\begin{block}{Antwort}250Eine Hash-Funktion $h$ bildet von einem sehr großem251Definitionsbereich auf einen deutlich kleineren Wertebereich252ab.253\end{block}254255\pause256257\begin{itemize}[<+->]258\item Meist ist der Wertebereich ein \myCode{int}, also $[-2147483648, 2147483647] = [-2^{31},2^{31}-1] \approx [-2 \cdot 10^9, 2 \cdot 10^9]$259\item Der Definitionsbereich kann alles mögliche sein260\item Normalerweise ist es nicht möglich, eine injektive Funktion zu finden261\end{itemize}262\end{frame}263264\subsection{hashCode() in Java}265\begin{frame}{hashCode() in Java}266\begin{block}{Signatur}267\myCode{public int hashCode()}268\end{block}269270\pause271272\begin{block}{Bedingung 1}273Whenever it is invoked on the same object more than once274during an execution of a Java application, the hashCode275method \textbf{must consistently return the same integer},276provided no information used in equals comparisons on the277object is modified. This integer need not remain consistent278from one execution of an application to another execution of279the same application.280\end{block}281{\tiny source: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc}}282\end{frame}283284\begin{frame}{hashCode() in Java}285\begin{block}{Bedingung 2}286If two objects are equal according to the equals(Object)287method, then calling the hashCode method on each of the two288objects \textbf{must} produce the same integer result.289\end{block}290{\tiny source: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc}}291292\pause293294\begin{block}{Klarstellung 1}295Es muss gelten:\\296$A.equals(B) \Rightarrow A.hashCode() == B.hashCode()$\\297Aber nicht:\\298$A.hashCode() == B.hashCode() \Rightarrow A.equals(B)$\\299Das ist meist auch nicht möglich. Beispiel:\\300Eine Klasse mit einem \myCode{double} als Rückgabewert.301\end{block}302\end{frame}303304\begin{frame}{hashCode() in Java}305\begin{block}{Klarstellung 2}306It is \textbf{not required} that if two objects are unequal according307to the equals(java.lang.Object) method, then calling the308hashCode method on each of the two objects must produce309distinct integer results.\\310However, the programmer should be311aware that producing distinct integer results for unequal312objects may improve the performance of hash tables.313\end{block}314{\tiny source: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc}}315\end{frame}316317\begin{frame}{hashCode(): Quiz}318Ist das eine korrekte Hash-Funktion?319\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Country-hashCode.java}320\end{frame}321322\begin{frame}{hashCode(): Antwort}323\begin{itemize}[<+->]324\item Ja, ist nach \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc} eine korrekte325Hash-Funktion326\item Aber: Es ist die wohl schlechteste korrekte Hash-Funktion327\item Sogar praktisch nutzlos328\item \alert<5>{NIEMALS} so machen!329\end{itemize}330\end{frame}331332\begin{frame}{hashCode(): Set}333\href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#equals(java.lang.Object)}{hashCode()} und \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#equals(java.lang.Object)}{equals()} sind für \href{http://docs.oracle.com/javase/7/docs/api/java/util/Set.html}{Set} wichtig.334\end{frame}335336\section{Interface}337\subsection{Allgemeines}338\begin{frame}{Allgemeines}339War Thema in Tutorium Nr. 8340\end{frame}341342\section{abstract}343\subsection{Allgemeines}344\begin{frame}{Allgemeines}345\begin{block}{docs.oracle.com Tutorial}346Eine abstrakte Klasse ist eine Klasse mit dem \myCode{abstract}-Schlüsselwort.347Sie kann abstrakte Methoden beinhalten.\\348Abstrakte Klassen können nicht instanziiert werden, aber man kann349Unterklassen bilden.350\end{block}351352Abstrakte Klassen353\begin{itemize}[<+->]354\item \dots müssen keine abstrakten Methoden beinhalten\\355{\tiny Quelle: \href{http://stackoverflow.com/q/4811678/562769}{Defining an abstract class without any abstract methods}}356\item \dots sollten eine abstrakte Methode beinhalten\\357{\tiny Quelle: \href{http://stackoverflow.com/q/2283399/562769}{Should an abstract class have at least one abstract method?}}358\item \dots können Konstruktoren haben\\359{\tiny Quelle: \href{http://stackoverflow.com/q/7644342/562769}{Abstract class is using it's own abstract method?}}360\item \dots können konkret impementierte Methoden haben\\361{\tiny Quelle: \href{http://answers.yahoo.com/question/index?qid=20111207141904AABXAvh}{Can an abstract class have concrete(non-abstract method) methods?}}362\end{itemize}363\end{frame}364365\begin{frame}{Beispiel}366\begin{block}{What are practical examples of abstract classes in java?}367\begin{itemize}368\item \href{http://stackoverflow.com/a/1509826/562769}{StackOverflow}369\item FileParser, CameraFileParser370\end{itemize}371\end{block}372\end{frame}373374\subsection{Abstract Classes vs Interfaces}375\begin{frame}{Abstract Classes vs Interfaces}376Abstrakte Klassen können \dots377\begin{itemize}378\item Attribute haben, die nicht \myCode{static} und \myCode{final} sind379\item Implementierte Methoden haben380\end{itemize}381382\begin{block}{Wenn nutze ich Interfaces?}383Wenn ich nur abstrakte Methoden habe384\end{block}385\end{frame}386387388389\subsection{Literatur}390\begin{frame}{Literatur}391\begin{itemize}392\item docs.oracle.com Tutorial: \href{http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html}{Abstract Methods and Classes}393\item codestyle.org: \href{http://www.codestyle.org/java/faq-Abstract.shtml}{Java abstract classes FAQ}394\item openbook.galileodesign.de: \href{http://openbook.galileodesign.de/javainsel5/javainsel06_009.htm\#Rxx747java06009040001EA1F04F100}{Abstrakte Klassen und abstrakte Methoden}395\end{itemize}396\end{frame}397398\section{final}399\subsection{Allgemeines}400\begin{frame}{Allgemeines}401\begin{itemize}402\item Finale Klassen können keine Unterklassen haben403\item Beispiel: \myCode{String}, \myCode{StringBuffer}, \myCode{StringBuilder}, \myCode{Math}:404\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=1, firstline=1, lastline=6]{java}{singleLines.java}405\end{itemize}406\end{frame}407408\subsection{Literatur}409\begin{frame}{Literatur}410\begin{itemize}411\item docs.oracle.com Tutorial: \href{http://docs.oracle.com/javase/tutorial/java/IandI/final.html}{Writing Final Classes and Methods}412\item openbook.galileodesign.de: \href{http://openbook.galileodesign.de/javainsel5/javainsel06_006.htm\#Rxx747java06006040001E71F019239}{Finale Klassen}413\end{itemize}414\end{frame}415416%\section{Tipp}417%\subsection{Java API-Code anschauen}418%\begin{frame}{Java API-Code anschauen}419% \begin{itemize}420% \item In Eclipse gehen421% \item Eine Funktion der Java API-Klasse, die ihr nutzen wollt, hinschreiben422% \item \menukeys{Strg} + Rechtsklick auf die Funktion423% \end{itemize}424%\end{frame}425426427\section{Abspann}428\subsection{Klausuranmeldung}429\begin{frame}{Klausuranmeldung}430\begin{itemize}431\item Anmeldebeginn: 28.1.432\item Anmeldeschluss / Abmeldeschluss: 28.2.433\item Ausgabetermin für Teil 1: 28.1.434\item Ausgabetermin für Teil 2: 11.2.435\item Abgabefrist für Teil 1: 11.3.436\item Abgabefrist für Teil 2: 25.3.437\end{itemize}438\end{frame}439440\subsection{Kommende Tutorien}441\begin{frame}{Kommende Tutorien}442\begin{itemize}443\item[3.] 14.01.2013444\item[2.] 21.01.2013445\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung446\item[-] 28.01.2013: Ausgabetermin für Teil 1447\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung448\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})449\end{itemize}450\end{frame}451452\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-user-too-dumb.jpg}453454\end{document}455456457