Просмотр исходного кода

Reduce duplicated code in similarity computing.

Alberth 5 лет назад
Родитель
Сommit
149ce6dd37

+ 5 - 25
jplag/src/main/java/de/jplag/JPlagComparison.java

@@ -175,16 +175,9 @@ public class JPlagComparison implements Comparator<JPlagComparison> { // FIXME T
      * @return Similarity in percent (what percentage of tokens across both submissions are matched).
      */
     public final float similarity() {
-        float sa, sb;
-        JPlagComparison firstBaseCodeMatches = firstSubmission.getBaseCodeComparison();
-        JPlagComparison secondBaseCodeMatches = secondSubmission.getBaseCodeComparison();
-        if (secondBaseCodeMatches != null && firstBaseCodeMatches != null) {
-            sa = firstSubmission.getNumberOfTokens() - firstSubmission.getFiles().size() - firstBaseCodeMatches.getNumberOfMatchedTokens();
-            sb = secondSubmission.getNumberOfTokens() - secondSubmission.getFiles().size() - secondBaseCodeMatches.getNumberOfMatchedTokens();
-        } else {
-            sa = firstSubmission.getNumberOfTokens() - firstSubmission.getFiles().size();
-            sb = secondSubmission.getNumberOfTokens() - secondSubmission.getFiles().size();
-        }
+        boolean subtractBaseCode = firstSubmission.hasBaseCodeMatches() && secondSubmission.hasBaseCodeMatches();
+        float sa = firstSubmission.getSimilarityDivisor(subtractBaseCode);
+        float sb = secondSubmission.getSimilarityDivisor(subtractBaseCode);
         return (200 * getNumberOfMatchedTokens()) / (sa + sb);
     }
 
@@ -193,13 +186,7 @@ public class JPlagComparison implements Comparator<JPlagComparison> { // FIXME T
      * second).
      */
     public final float similarityOfFirst() {
-        int divisor;
-        JPlagComparison firstBaseCodeMatches = firstSubmission.getBaseCodeComparison();
-        if (firstBaseCodeMatches != null) {
-            divisor = firstSubmission.getNumberOfTokens() - firstSubmission.getFiles().size() - firstBaseCodeMatches.getNumberOfMatchedTokens();
-        } else {
-            divisor = firstSubmission.getNumberOfTokens() - firstSubmission.getFiles().size();
-        }
+        int divisor = firstSubmission.getSimilarityDivisor(true);
         return (divisor == 0 ? 0f : (getNumberOfMatchedTokens() * 100 / (float) divisor));
     }
 
@@ -208,13 +195,7 @@ public class JPlagComparison implements Comparator<JPlagComparison> { // FIXME T
      * first).
      */
     public final float similarityOfSecond() {
-        int divisor;
-        JPlagComparison secondBaseCodeMatches = secondSubmission.getBaseCodeComparison();
-        if (secondBaseCodeMatches != null) {
-            divisor = secondSubmission.getNumberOfTokens() - secondSubmission.getFiles().size() - secondBaseCodeMatches.getNumberOfMatchedTokens();
-        } else {
-            divisor = secondSubmission.getNumberOfTokens() - secondSubmission.getFiles().size();
-        }
+        int divisor = secondSubmission.getSimilarityDivisor(true);
         return (divisor == 0 ? 0f : (getNumberOfMatchedTokens() * 100 / (float) divisor));
     }
 
@@ -275,5 +256,4 @@ public class JPlagComparison implements Comparator<JPlagComparison> { // FIXME T
         JPlagComparison secondBaseCodeMatches = secondSubmission.getBaseCodeComparison();
         return secondBaseCodeMatches.getNumberOfMatchedTokens() * 100 / sb;
     }
-
 }

+ 18 - 0
jplag/src/main/java/de/jplag/Submission.java

@@ -114,6 +114,24 @@ public class Submission implements Comparable<Submission> {
         return baseCodeComparison;
     }
 
+    /**
+     * @return Whether a comparison between the submission and the base code is available.
+     */
+    public boolean hasBaseCodeMatches() {
+        return baseCodeComparison != null;
+    }
+
+    /**
+     * @param subtractBaseCode If true subtract basecode matches if possible.
+     * @return Similarity divisor for the submission.
+     */
+    public int getSimilarityDivisor(boolean subtractBaseCode) {
+        int divisor = getNumberOfTokens() - getFiles().size();
+        if (subtractBaseCode && baseCodeComparison != null) {
+            divisor -= baseCodeComparison.getNumberOfMatchedTokens();
+        }
+        return divisor;
+    }
 
     /**
      * @return Parse result of the submission.