feat: add Skiplist impl
parent
c63d0e5354
commit
17a471e3a0
|
|
@ -0,0 +1,135 @@
|
|||
# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,java,maven,eclipse
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,java,maven,eclipse
|
||||
|
||||
### Eclipse ###
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.settings/
|
||||
.loadpath
|
||||
.recommenders
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# PyDev specific (Python IDE for Eclipse)
|
||||
*.pydevproject
|
||||
|
||||
# CDT-specific (C/C++ Development Tooling)
|
||||
.cproject
|
||||
|
||||
# CDT- autotools
|
||||
.autotools
|
||||
|
||||
# Java annotation processor (APT)
|
||||
.factorypath
|
||||
|
||||
# PDT-specific (PHP Development Tools)
|
||||
.buildpath
|
||||
|
||||
# sbteclipse plugin
|
||||
.target
|
||||
|
||||
# Tern plugin
|
||||
.tern-project
|
||||
|
||||
# TeXlipse plugin
|
||||
.texlipse
|
||||
|
||||
# STS (Spring Tool Suite)
|
||||
.springBeans
|
||||
|
||||
# Code Recommenders
|
||||
.recommenders/
|
||||
|
||||
# Annotation Processing
|
||||
.apt_generated/
|
||||
.apt_generated_test/
|
||||
|
||||
# Scala IDE specific (Scala & Java development for Eclipse)
|
||||
.cache-main
|
||||
.scala_dependencies
|
||||
.worksheet
|
||||
|
||||
# Uncomment this line if you wish to ignore the project description file.
|
||||
# Typically, this file would be tracked if it contains build/dependency configurations:
|
||||
#.project
|
||||
|
||||
### Eclipse Patch ###
|
||||
# Spring Boot Tooling
|
||||
.sts4-cache/
|
||||
|
||||
### Java ###
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
|
||||
### Maven ###
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
# Eclipse m2e generated files
|
||||
# Eclipse Core
|
||||
.project
|
||||
# JDT-specific (Eclipse Java Development Tools)
|
||||
.classpath
|
||||
|
||||
### VisualStudioCode ###
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/*.code-snippets
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
|
||||
### VisualStudioCode Patch ###
|
||||
# Ignore all local history of files
|
||||
.history
|
||||
.ionide
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,java,maven,eclipse
|
||||
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module PUBLIC
|
||||
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
|
||||
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
|
||||
|
||||
<!--
|
||||
|
||||
Checkstyle configuration that checks the sun coding conventions from:
|
||||
|
||||
- the Java Language Specification at
|
||||
http://java.sun.com/docs/books/jls/second_edition/html/index.html
|
||||
|
||||
- the Sun Code Conventions at http://java.sun.com/docs/codeconv/
|
||||
|
||||
- the Javadoc guidelines at
|
||||
http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
|
||||
|
||||
- the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
|
||||
|
||||
- some best practices
|
||||
|
||||
Checkstyle is very configurable. Be sure to read the documentation at
|
||||
http://checkstyle.sf.net (or in your downloaded distribution).
|
||||
|
||||
Most Checks are configurable, be sure to consult the documentation.
|
||||
|
||||
To completely disable a check, just comment it out or delete it from the file.
|
||||
|
||||
Finally, it is worth reading the documentation.
|
||||
|
||||
-->
|
||||
|
||||
<module name="Checker">
|
||||
|
||||
<!--
|
||||
If you set the basedir property below, then all reported file
|
||||
names will be relative to the specified directory. See
|
||||
http://checkstyle.sourceforge.net/5.x/config.html#Checker
|
||||
|
||||
<property name="basedir" value="${basedir}"/>
|
||||
-->
|
||||
|
||||
<!-- Checks whether files end with a new line. -->
|
||||
<!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
|
||||
<!-- <module name="NewlineAtEndOfFile"/> -->
|
||||
|
||||
<!-- Checks that property files contain the same keys. -->
|
||||
<!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
|
||||
<module name="Translation"/>
|
||||
|
||||
<!-- Checks for Size Violations. -->
|
||||
<!-- See http://checkstyle.sf.net/config_sizes.html -->
|
||||
<module name="FileLength"/>
|
||||
|
||||
<!-- Checks for whitespace -->
|
||||
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
|
||||
<module name="FileTabCharacter"/>
|
||||
|
||||
<!-- Miscellaneous other checks. -->
|
||||
<!-- See http://checkstyle.sf.net/config_misc.html -->
|
||||
<!--
|
||||
<module name="RegexpSingleline">
|
||||
<property name="format" value="\s+$"/>
|
||||
<property name="minimum" value="0"/>
|
||||
<property name="maximum" value="0"/>
|
||||
<property name="message" value="Line has trailing spaces."/>
|
||||
</module>
|
||||
-->
|
||||
|
||||
<module name="LineLength">
|
||||
<property name="ignorePattern" value="^.*//#.*|^.* \* @see .*|^import .*"/>
|
||||
<property name="max" value="100"/>
|
||||
</module>
|
||||
|
||||
<module name="TreeWalker">
|
||||
<module name="SuppressionCommentFilter"/>
|
||||
<!-- Checks for Javadoc comments. -->
|
||||
<!-- See http://checkstyle.sf.net/config_javadoc.html -->
|
||||
<module name="JavadocMethod"/>
|
||||
<module name="JavadocType"/>
|
||||
<module name="JavadocVariable">
|
||||
<property name="scope" value="public"/>
|
||||
</module>
|
||||
<module name="JavadocStyle"/>
|
||||
|
||||
|
||||
<!-- Checks for Naming Conventions. -->
|
||||
<!-- See http://checkstyle.sf.net/config_naming.html -->
|
||||
<module name="ConstantName"/>
|
||||
<module name="LocalFinalVariableName"/>
|
||||
<module name="LocalVariableName"/>
|
||||
<module name="MemberName"/>
|
||||
<module name="MethodName"/>
|
||||
<module name="PackageName">
|
||||
<property name="format" value="^[a-z][a-z0-9_]+(\.[a-z][a-z0-9_]*)*$"/>
|
||||
</module>
|
||||
<module name="ParameterName"/>
|
||||
<module name="StaticVariableName"/>
|
||||
<module name="TypeName"/>
|
||||
|
||||
|
||||
<!-- Checks for Headers -->
|
||||
<!-- See http://checkstyle.sf.net/config_header.html -->
|
||||
<!-- <module name="Header"> -->
|
||||
<!-- The follow property value demonstrates the ability -->
|
||||
<!-- to have access to ANT properties. In this case it uses -->
|
||||
<!-- the ${basedir} property to allow Checkstyle to be run -->
|
||||
<!-- from any directory within a project. See property -->
|
||||
<!-- expansion, -->
|
||||
<!-- http://checkstyle.sf.net/config.html#properties -->
|
||||
<!-- <property -->
|
||||
<!-- name="headerFile" -->
|
||||
<!-- value="${basedir}/java.header"/> -->
|
||||
<!-- </module> -->
|
||||
|
||||
<!-- Following interprets the header file as regular expressions. -->
|
||||
<!-- <module name="RegexpHeader"/> -->
|
||||
|
||||
|
||||
<!-- Checks for imports -->
|
||||
<!-- See http://checkstyle.sf.net/config_import.html -->
|
||||
<module name="AvoidStarImport"/>
|
||||
<module name="IllegalImport"/> <!-- defaults to sun.* packages -->
|
||||
<module name="RedundantImport"/>
|
||||
<module name="UnusedImports"/>
|
||||
|
||||
|
||||
<!-- Checks for Size Violations. -->
|
||||
<!-- See http://checkstyle.sf.net/config_sizes.html -->
|
||||
<module name="MethodLength">
|
||||
<property name="countEmpty" value="false"/>
|
||||
</module>
|
||||
<module name="ParameterNumber"/>
|
||||
|
||||
|
||||
<!-- Checks for whitespace -->
|
||||
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
|
||||
<module name="EmptyForIteratorPad"/>
|
||||
<module name="GenericWhitespace"/>
|
||||
<module name="MethodParamPad"/>
|
||||
<module name="NoWhitespaceAfter">
|
||||
<property name="tokens" value="AT, INC, DEC, UNARY_MINUS, UNARY_PLUS, BNOT, LNOT, DOT, ARRAY_DECLARATOR, INDEX_OP"/>
|
||||
</module>
|
||||
<module name="NoWhitespaceBefore">
|
||||
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, ELLIPSIS, LABELED_STAT"/>
|
||||
</module>
|
||||
<module name="OperatorWrap"/>
|
||||
<module name="ParenPad"/>
|
||||
<module name="TypecastParenPad"/>
|
||||
<module name="WhitespaceAfter"/>
|
||||
<module name="WhitespaceAround"/>
|
||||
|
||||
|
||||
<!-- Modifier Checks -->
|
||||
<!-- See http://checkstyle.sf.net/config_modifiers.html -->
|
||||
<module name="ModifierOrder"/>
|
||||
<!-- <module name="RedundantModifier"/> -->
|
||||
|
||||
|
||||
<!-- Checks for blocks. You know, those {}'s -->
|
||||
<!-- See http://checkstyle.sf.net/config_blocks.html -->
|
||||
<module name="AvoidNestedBlocks"/>
|
||||
<module name="EmptyBlock"/>
|
||||
<module name="LeftCurly"/>
|
||||
<module name="NeedBraces"/>
|
||||
<!-- <module name="RightCurly"/> -->
|
||||
|
||||
|
||||
<!-- Checks for common coding problems -->
|
||||
<!-- See http://checkstyle.sf.net/config_coding.html -->
|
||||
<!-- <module name="AvoidInlineConditionals"/> -->
|
||||
<module name="EmptyStatement"/>
|
||||
<module name="EqualsHashCode"/>
|
||||
<module name="HiddenField">
|
||||
<property name="ignoreConstructorParameter" value="true"/>
|
||||
<property name="ignoreSetter" value="true"/>
|
||||
</module>
|
||||
<module name="IllegalInstantiation"/>
|
||||
<module name="InnerAssignment"/>
|
||||
<module name="MissingSwitchDefault"/>
|
||||
<module name="SimplifyBooleanExpression"/>
|
||||
<module name="SimplifyBooleanReturn"/>
|
||||
|
||||
<!-- Checks for class design -->
|
||||
<!-- See http://checkstyle.sf.net/config_design.html -->
|
||||
<!-- <module name="DesignForExtension"/> -->
|
||||
<module name="FinalClass"/>
|
||||
<!-- <module name="HideUtilityClassConstructor"/> -->
|
||||
<module name="InterfaceIsType"/>
|
||||
<module name="VisibilityModifier">
|
||||
<property name="protectedAllowed" value="true"/>
|
||||
<property name="packageAllowed" value="true"/>
|
||||
</module>
|
||||
|
||||
|
||||
<!-- Miscellaneous other checks. -->
|
||||
<!-- See http://checkstyle.sf.net/config_misc.html -->
|
||||
<module name="ArrayTypeStyle"/>
|
||||
<!-- <module name="FinalParameters"/> -->
|
||||
<module name="TodoComment"/>
|
||||
<module name="UpperEll"/>
|
||||
|
||||
</module>
|
||||
</module>
|
||||
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<ruleset name="Custom Rules"
|
||||
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
|
||||
|
||||
<description>
|
||||
My custom rules
|
||||
</description>
|
||||
|
||||
<rule ref="category/java/bestpractices.xml/AccessorClassGeneration"/>
|
||||
|
||||
|
||||
<!-- <rule ref="category/java/bestpractices.xml/AvoidMessageDigestField"/> -->
|
||||
|
||||
|
||||
<rule ref="category/java/bestpractices.xml/AvoidReassigningCatchVariables"/>
|
||||
<rule ref="category/java/bestpractices.xml/AvoidReassigningLoopVariables"/>
|
||||
<rule ref="category/java/bestpractices.xml/AvoidReassigningParameters"/>
|
||||
<rule ref="category/java/bestpractices.xml/AvoidStringBufferField"/>
|
||||
<rule ref="category/java/bestpractices.xml/AvoidUsingHardCodedIP"/>
|
||||
<rule ref="category/java/bestpractices.xml/CheckResultSet"/>
|
||||
<rule ref="category/java/bestpractices.xml/ConstantsInInterface"/>
|
||||
<rule ref="category/java/bestpractices.xml/DefaultLabelNotLastInSwitch"/>
|
||||
<rule ref="category/java/bestpractices.xml/DoubleBraceInitialization"/>
|
||||
<rule ref="category/java/bestpractices.xml/ForLoopCanBeForeach"/>
|
||||
<rule ref="category/java/bestpractices.xml/ForLoopVariableCount"/>
|
||||
<rule ref="category/java/bestpractices.xml/GuardLogStatement"/>
|
||||
<rule ref="category/java/bestpractices.xml/JUnit4SuitesShouldUseSuiteAnnotation"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseAfterAnnotation"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseBeforeAnnotation"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseTestAnnotation"/>
|
||||
<rule ref="category/java/bestpractices.xml/JUnit5TestShouldBePackagePrivate"/>
|
||||
<!-- <rule ref="category/java/bestpractices.xml/UnitTestAssertionsShouldIncludeMessage"/> -->
|
||||
<!-- <rule ref="category/java/bestpractices.xml/UnitTestContainsTooManyAsserts"/> -->
|
||||
<!-- <rule ref="category/java/bestpractices.xml/UnitTestShouldIncludeAssert"/> -->
|
||||
<rule ref="category/java/bestpractices.xml/JUnitUseExpected"/>
|
||||
<rule ref="category/java/bestpractices.xml/LiteralsFirstInComparisons"/>
|
||||
<rule ref="category/java/bestpractices.xml/LooseCoupling"/>
|
||||
<rule ref="category/java/bestpractices.xml/MethodReturnsInternalArray"/>
|
||||
<rule ref="category/java/bestpractices.xml/MissingOverride"/>
|
||||
<rule ref="category/java/bestpractices.xml/OneDeclarationPerLine"/>
|
||||
<rule ref="category/java/bestpractices.xml/PreserveStackTrace"/>
|
||||
<rule ref="category/java/bestpractices.xml/PrimitiveWrapperInstantiation"/>
|
||||
<rule ref="category/java/bestpractices.xml/ReplaceEnumerationWithIterator"/>
|
||||
<rule ref="category/java/bestpractices.xml/ReplaceHashtableWithMap"/>
|
||||
<rule ref="category/java/bestpractices.xml/ReplaceVectorWithList"/>
|
||||
<rule ref="category/java/bestpractices.xml/SimplifiableTestAssertion"/>
|
||||
<rule ref="category/java/bestpractices.xml/NonExhaustiveSwitch"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnusedAssignment"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnusedFormalParameter"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnusedPrivateField"/>
|
||||
<rule ref="category/java/bestpractices.xml/UnusedPrivateMethod"/>
|
||||
<rule ref="category/java/bestpractices.xml/UseCollectionIsEmpty"/>
|
||||
<rule ref="category/java/bestpractices.xml/UseStandardCharsets"/>
|
||||
<rule ref="category/java/bestpractices.xml/WhileLoopWithLiteralBoolean"/>
|
||||
|
||||
</ruleset>
|
||||
|
|
@ -0,0 +1,160 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>de.hs_mannheim.pr2</groupId>
|
||||
<artifactId>solutions</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>PR2 Excercises</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<junit.jupiter.version>5.12.2</junit.jupiter.version>
|
||||
<junit.platform.version>1.12.2</junit.platform.version>
|
||||
<pmdVersion>7.13.0</pmdVersion>
|
||||
</properties>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<build>
|
||||
<defaultGoal>install</defaultGoal>
|
||||
<directory>${basedir}/target</directory>
|
||||
<finalName>${project.artifactId}-${project.version}</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.10.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.5.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<version>3.5.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>3.6.0</version>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.puppycrawl.tools</groupId>
|
||||
<artifactId>checkstyle</artifactId>
|
||||
<version>10.4</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<configuration>
|
||||
<configLocation>checkstyle.xml</configLocation>
|
||||
<consoleOutput>true</consoleOutput>
|
||||
<failsOnError>true</failsOnError>
|
||||
<linkXRef>false</linkXRef>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>validate</id>
|
||||
<phase>validate</phase>
|
||||
<goals>
|
||||
<goal>check</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-pmd-plugin</artifactId>
|
||||
<version>3.26.0</version>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.pmd</groupId>
|
||||
<artifactId>pmd-core</artifactId>
|
||||
<version>${pmdVersion}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.pmd</groupId>
|
||||
<artifactId>pmd-java</artifactId>
|
||||
<version>${pmdVersion}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.pmd</groupId>
|
||||
<artifactId>pmd-javascript</artifactId>
|
||||
<version>${pmdVersion}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.pmd</groupId>
|
||||
<artifactId>pmd-jsp</artifactId>
|
||||
<version>${pmdVersion}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<configuration>
|
||||
<rulesets>
|
||||
<ruleset>./pmd.xml</ruleset>
|
||||
</rulesets>
|
||||
<failOnViolation>true</failOnViolation>
|
||||
<printFailingErrors>true</printFailingErrors>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>check</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<!--
|
||||
<dependency>
|
||||
<groupId>de.smits_net.games</groupId>
|
||||
<artifactId>game-framework</artifactId>
|
||||
<version>1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
-->
|
||||
<dependency>
|
||||
<groupId>com.github.thomsmits</groupId>
|
||||
<artifactId> game-framework</artifactId>
|
||||
<version>v1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<version>${junit.jupiter.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>${junit.jupiter.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-params</artifactId>
|
||||
<version>${junit.jupiter.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-suite</artifactId>
|
||||
<version>${junit.platform.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
<version>${junit.jupiter.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jfree</groupId>
|
||||
<artifactId>jfreechart</artifactId>
|
||||
<version>1.5.3</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
|
|
@ -0,0 +1,196 @@
|
|||
package de.hs_mannheim.pr2;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*/
|
||||
public class Skiplist<T> {
|
||||
|
||||
Node head = null;
|
||||
int size = 0;
|
||||
int lvl = 1;
|
||||
Comparator<? super T> comparator = null;
|
||||
Random rng = new Random();
|
||||
|
||||
int cpr(T x, T y) {
|
||||
return comparator != null ? comparator.compare(x, y) : ((Comparable<T>)x).compareTo(y);
|
||||
}
|
||||
|
||||
public Skiplist() {
|
||||
comparator = null;
|
||||
head = new Node(null, true);
|
||||
}
|
||||
|
||||
public Skiplist(Comparator<? super T> comparator) {
|
||||
this.comparator = comparator;
|
||||
head = new Node(null, true);
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public boolean empty() {
|
||||
return size == 0;
|
||||
}
|
||||
|
||||
private void insertAtLvl(int lvl, Node oldNode) {
|
||||
Node newNode = new Node(oldNode.value);
|
||||
newNode.down = oldNode;
|
||||
|
||||
if (this.lvl < lvl) {
|
||||
throw new RuntimeException();
|
||||
} else if (this.lvl == lvl) {
|
||||
Node newHead = new Node(null, true);
|
||||
newHead.down = this.head;
|
||||
this.head = newHead;
|
||||
this.lvl += 1;
|
||||
}
|
||||
|
||||
if (rng.nextDouble() < 0.5) {
|
||||
insertAtLvl(lvl + 1, newNode);
|
||||
}
|
||||
|
||||
Node currentNode = this.head;
|
||||
for (int i = 0; i < this.lvl - lvl - 1; i++) {
|
||||
currentNode = currentNode.down;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
if (currentNode.next == null || cpr(currentNode.next.value, newNode.value) > 0) {
|
||||
newNode.next = currentNode.next;
|
||||
currentNode.next = newNode;
|
||||
return;
|
||||
}
|
||||
currentNode = currentNode.next;
|
||||
}
|
||||
}
|
||||
|
||||
public void add(T data) {
|
||||
Node node = new Node(data);
|
||||
Node currentNode = head;
|
||||
int counter = 0;
|
||||
while (true) {
|
||||
if (currentNode.next == null || cpr(currentNode.next.value, data) > 0) {
|
||||
if (currentNode.down == null) {
|
||||
node.next = currentNode.next;
|
||||
currentNode.next = node;
|
||||
break;
|
||||
} else {
|
||||
currentNode = currentNode.down;
|
||||
}
|
||||
} else {
|
||||
currentNode = currentNode.next;
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
size += 1;
|
||||
if (rng.nextDouble() < 0.5) {
|
||||
insertAtLvl(1, node);
|
||||
}
|
||||
System.out.println("adding took " + counter + " steps");
|
||||
}
|
||||
|
||||
private void removeUpper(int lvl, Node node) {
|
||||
Node currentNode = this.head;
|
||||
for (int i = 0; i < this.lvl - lvl - 1; i++) {
|
||||
currentNode = currentNode.down;
|
||||
}
|
||||
while (currentNode.next != null) {
|
||||
if (currentNode.next.down == node) {
|
||||
removeUpper(lvl + 1, currentNode.next);
|
||||
currentNode.next = currentNode.next.next;
|
||||
return;
|
||||
}
|
||||
currentNode = currentNode.next;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public T pop() {
|
||||
if (size == 0) {
|
||||
return null;
|
||||
}
|
||||
Node head = this.head;
|
||||
while (head.down != null) {
|
||||
head = head.down;
|
||||
}
|
||||
removeUpper(1, head.next);
|
||||
T result = head.next.value;
|
||||
head.next = head.next.next;
|
||||
size -= 1;
|
||||
return result;
|
||||
}
|
||||
|
||||
public T get(int location) {
|
||||
if (location >= size) {
|
||||
return null;
|
||||
}
|
||||
Node currentNode = head;
|
||||
while (currentNode.down != null) {
|
||||
currentNode = currentNode.down;
|
||||
}
|
||||
currentNode = currentNode.next;
|
||||
|
||||
for (int i = 0; i < location; i++) {
|
||||
currentNode = currentNode.next;
|
||||
}
|
||||
return currentNode.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
Node currentHead = head;
|
||||
StringBuilder result = new StringBuilder();
|
||||
while (currentHead != null) {
|
||||
Node currentNode = currentHead;
|
||||
while (currentNode != null) {
|
||||
result.append(currentNode);
|
||||
currentNode = currentNode.next;
|
||||
}
|
||||
currentHead = currentHead.down;
|
||||
result.append("\n");
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public String toString() {
|
||||
// return head.toString();
|
||||
// }
|
||||
|
||||
private class Node {
|
||||
Node next = null;
|
||||
Node down = null;
|
||||
T value;
|
||||
boolean dummy = false;
|
||||
|
||||
Node(T value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
Node(T value, Boolean dummy) {
|
||||
this.dummy = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
// String result = "";
|
||||
// if (this.down != null) {
|
||||
// result += this.down.toString();
|
||||
// result += " --v\n";
|
||||
// }
|
||||
// if (this.next != null) {
|
||||
// result += this.next.toString();
|
||||
// }
|
||||
if (dummy) {
|
||||
return "[dummy]";
|
||||
} else {
|
||||
return "[" + value + "]";
|
||||
}
|
||||
// return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
package de.hs_mannheim.pr2;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class SkiplistTest {
|
||||
|
||||
/**
|
||||
* Rigorous Test :-)
|
||||
*/
|
||||
@Test
|
||||
public void shouldAnswerWithTrue() {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canPush() {
|
||||
Skiplist<Integer> list = new Skiplist<Integer>();
|
||||
list.add(1);
|
||||
list.add(3);
|
||||
list.add(2);
|
||||
list.add(4);
|
||||
list.add(10);
|
||||
list.add(7);
|
||||
list.add(8);
|
||||
list.add(6);
|
||||
list.add(3);
|
||||
System.out.println(list);
|
||||
assertEquals(9, list.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canPop() {
|
||||
Skiplist<Integer> list = new Skiplist<Integer>();
|
||||
list.add(1);
|
||||
list.add(3);
|
||||
list.add(2);
|
||||
list.add(4);
|
||||
list.add(10);
|
||||
list.add(7);
|
||||
list.add(8);
|
||||
list.add(6);
|
||||
list.add(3);
|
||||
System.out.println(list);
|
||||
assertEquals(1, list.pop().intValue());
|
||||
System.out.println(list);
|
||||
assertEquals(2, list.pop().intValue());
|
||||
System.out.println(list);
|
||||
assertEquals(3, list.pop().intValue());
|
||||
System.out.println(list);
|
||||
assertEquals(3, list.pop().intValue());
|
||||
System.out.println(list);
|
||||
assertEquals(4, list.pop().intValue());
|
||||
System.out.println(list);
|
||||
assertEquals(6, list.pop().intValue());
|
||||
System.out.println(list);
|
||||
assertTrue(list.size() == 3);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canGet() {
|
||||
Skiplist<Integer> list = new Skiplist<Integer>();
|
||||
list.add(1);
|
||||
list.add(2);
|
||||
list.add(3);
|
||||
assertEquals(1, list.get(0).intValue());
|
||||
assertEquals(2, list.get(1).intValue());
|
||||
assertEquals(3, list.get(2).intValue());
|
||||
assertEquals(null, list.get(3));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue