You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opennlp.apache.org by rz...@apache.org on 2023/12/19 07:47:37 UTC

(opennlp) 01/01: OPENNLP-421 - Remove StringListWrapper

This is an automated email from the ASF dual-hosted git repository.

rzo1 pushed a commit to branch OPENNLP-421-StringWrapper
in repository https://gitbox.apache.org/repos/asf/opennlp.git

commit 06424837cc33ccc1ec59688bcb404b33f18d19cc
Author: Richard Zowalla <ri...@hs-heilbronn.de>
AuthorDate: Tue Dec 19 08:47:26 2023 +0100

    OPENNLP-421 - Remove StringListWrapper
---
 .../java/opennlp/tools/dictionary/Dictionary.java  | 82 ++++++----------------
 .../main/java/opennlp/tools/util/StringList.java   | 77 +++++++++++++++-----
 2 files changed, 81 insertions(+), 78 deletions(-)

diff --git a/opennlp-tools/src/main/java/opennlp/tools/dictionary/Dictionary.java b/opennlp-tools/src/main/java/opennlp/tools/dictionary/Dictionary.java
index f007f6b4..3fc07c75 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/dictionary/Dictionary.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/dictionary/Dictionary.java
@@ -32,7 +32,6 @@ import opennlp.tools.dictionary.serializer.Attributes;
 import opennlp.tools.dictionary.serializer.DictionaryEntryPersistor;
 import opennlp.tools.dictionary.serializer.Entry;
 import opennlp.tools.util.StringList;
-import opennlp.tools.util.StringUtil;
 import opennlp.tools.util.model.DictionarySerializer;
 import opennlp.tools.util.model.SerializableArtifact;
 
@@ -43,56 +42,7 @@ import opennlp.tools.util.model.SerializableArtifact;
  * @see Iterable
  */
 public class Dictionary implements Iterable<StringList>, SerializableArtifact {
-
-  private class StringListWrapper {
-
-    private final StringList stringList;
-
-    private StringListWrapper(StringList stringList) {
-      this.stringList = stringList;
-    }
-
-    private StringList getStringList() {
-      return stringList;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-
-      boolean result;
-
-      if (obj == this) {
-        result = true;
-      }
-      else if (obj instanceof StringListWrapper other) {
-
-        if (isCaseSensitive) {
-          result = this.stringList.equals(other.getStringList());
-        }
-        else {
-          result = this.stringList.compareToIgnoreCase(other.getStringList());
-        }
-      }
-      else {
-        result = false;
-      }
-
-      return result;
-    }
-
-    @Override
-    public int hashCode() {
-      // if lookup is too slow optimize this
-      return StringUtil.toLowerCase(this.stringList.toString()).hashCode();
-    }
-
-    @Override
-    public String toString() {
-      return this.stringList.toString();
-    }
-  }
-
-  private final Set<StringListWrapper> entrySet = new HashSet<>();
+  private final Set<StringList> entrySet = new HashSet<>();
   private final boolean isCaseSensitive;
   private int minTokenCount = 99999;
   private int maxTokenCount = 0;
@@ -131,7 +81,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
    * @param tokens the new entry
    */
   public void put(StringList tokens) {
-    entrySet.add(new StringListWrapper(tokens));
+    entrySet.add(applyCaseSensitivity(tokens));
     minTokenCount = StrictMath.min(minTokenCount, tokens.size());
     maxTokenCount = StrictMath.max(maxTokenCount, tokens.size());
   }
@@ -151,7 +101,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
    * @return {@code true} if it contains the entry, {@code false} otherwise.
    */
   public boolean contains(StringList tokens) {
-    return entrySet.contains(new StringListWrapper(tokens));
+    return entrySet.contains(applyCaseSensitivity(tokens));
   }
 
   /**
@@ -160,7 +110,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
    * @param tokens The tokens to be filtered out (= removed).
    */
   public void remove(StringList tokens) {
-    entrySet.remove(new StringListWrapper(tokens));
+    entrySet.remove(applyCaseSensitivity(tokens));
   }
 
   /**
@@ -168,7 +118,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
    */
   @Override
   public Iterator<StringList> iterator() {
-    final Iterator<StringListWrapper> entries = entrySet.iterator();
+    final Iterator<StringList> entries = entrySet.iterator();
 
     return new Iterator<>() {
 
@@ -179,7 +129,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
 
       @Override
       public StringList next() {
-        return entries.next().getStringList();
+        return entries.next();
       }
 
       @Override
@@ -308,7 +258,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
 
       @Override
       public Iterator<String> iterator() {
-        final Iterator<StringListWrapper> entries = entrySet.iterator();
+        final Iterator<StringList> entries = entrySet.iterator();
 
         return new Iterator<>() {
           @Override
@@ -317,7 +267,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
           }
           @Override
           public String next() {
-            return entries.next().getStringList().getToken(0);
+            return entries.next().getToken(0);
           }
           @Override
           public void remove() {
@@ -337,7 +287,7 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
 
         if (obj instanceof String str) {
 
-          result = entrySet.contains(new StringListWrapper(new StringList(str)));
+          result = entrySet.contains(applyCaseSensitivity(new StringList(isCaseSensitive, str)));
 
         }
         return result;
@@ -353,13 +303,13 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
           return false;
         }
         Iterator<String> toCheckIter = toCheck.iterator();
-        for (StringListWrapper entry : entrySet) {
+        for (StringList entry : entrySet) {
           if (isCaseSensitive) {
-            if (!entry.stringList.equals(new StringList(toCheckIter.next()))) {
+            if (!entry.equals(new StringList(true, toCheckIter.next()))) {
               return false;
             }
           } else {
-            if (!entry.stringList.compareToIgnoreCase(new StringList(toCheckIter.next()))) {
+            if (!entry.compareToIgnoreCase(new StringList(false, toCheckIter.next()))) {
               return false;
             }
           }
@@ -383,4 +333,12 @@ public class Dictionary implements Iterable<StringList>, SerializableArtifact {
   public Class<?> getArtifactSerializerClass() {
     return DictionarySerializer.class;
   }
+
+  private StringList applyCaseSensitivity(StringList list) {
+    if (isCaseSensitive) {
+      return list.toCaseSensitive();
+    } else {
+      return list.toCaseInsensitive();
+    }
+  }
 }
diff --git a/opennlp-tools/src/main/java/opennlp/tools/util/StringList.java b/opennlp-tools/src/main/java/opennlp/tools/util/StringList.java
index 3acad9f7..21de9ba0 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/util/StringList.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/util/StringList.java
@@ -31,6 +31,8 @@ public class StringList implements Iterable<String> {
 
   private final String[] tokens;
 
+  private final boolean caseSensitive;
+
   /**
    * Initializes a {@link StringList} instance.
    * <p>
@@ -40,7 +42,7 @@ public class StringList implements Iterable<String> {
    * @param singleToken One single token
    */
   public StringList(String singleToken) {
-    tokens = new String[]{StringInterners.intern(singleToken)};
+    this(true, singleToken);
   }
 
   /**
@@ -55,6 +57,22 @@ public class StringList implements Iterable<String> {
    * @throws IllegalArgumentException Thrown if parameters were invalid.
    */
   public StringList(String... tokens) {
+    this(true, tokens);
+  }
+
+  /**
+   * Initializes a {@link StringList} instance.
+   * <p>
+   * Note: <br>
+   * Token Strings will be interned via {@link StringInterners}.
+   *
+   * @param isCaseSensitive if a call to {@code equals(...)} should honor case or not.
+   * @param tokens The string parts of the new {@link StringList}.
+   *               Must not be an empty tokens array or {@code null}.
+   *
+   * @throws IllegalArgumentException Thrown if parameters were invalid.
+   */
+  public StringList(boolean isCaseSensitive, String... tokens) {
 
     Objects.requireNonNull(tokens, "tokens must not be null");
 
@@ -67,6 +85,8 @@ public class StringList implements Iterable<String> {
     for (int i = 0; i < tokens.length; i++) {
       this.tokens[i] = StringInterners.intern(tokens[i]);
     }
+
+    this.caseSensitive = isCaseSensitive;
   }
 
   /**
@@ -127,39 +147,35 @@ public class StringList implements Iterable<String> {
    * @return {@code true} if identically with ignore the case, {@code false} otherwise.
    */
   public boolean compareToIgnoreCase(StringList tokens) {
-
     if (size() == tokens.size()) {
       for (int i = 0; i < size(); i++) {
-
-        if (getToken(i).compareToIgnoreCase(
-            tokens.getToken(i)) != 0) {
+        if (getToken(i).compareToIgnoreCase(tokens.getToken(i)) != 0) {
           return false;
         }
       }
-    }
-    else {
+    } else {
       return false;
     }
-
     return true;
   }
 
   @Override
   public int hashCode() {
-    return Arrays.hashCode(tokens);
+    // if lookup is too slow optimize this
+    return StringUtil.toLowerCase(toString()).hashCode();
   }
 
   @Override
   public boolean equals(Object obj) {
-    if (this == obj) {
+    if (obj == this) {
       return true;
+    } else if (obj instanceof StringList tokenList) {
+      if (caseSensitive) {
+        return Arrays.equals(tokens, tokenList.tokens);
+      } else {
+        return compareToIgnoreCase(tokenList);
+      }
     }
-
-    if (obj instanceof StringList tokenList) {
-
-      return Arrays.equals(tokens, tokenList.tokens);
-    }
-
     return false;
   }
 
@@ -184,4 +200,33 @@ public class StringList implements Iterable<String> {
 
     return string.toString();
   }
+
+  /**
+   * @return {@code true}, if {@code equals(...)} honors cases.
+   */
+  public boolean isCaseSensitive() {
+    return caseSensitive;
+  }
+
+  /**
+   * @return If this {@link StringList} is case-insensitive,
+   * the same instance is returned. Otherwise, a new object is returned.
+   */
+  public StringList toCaseInsensitive() {
+    if (isCaseSensitive()) {
+      return new StringList(false, tokens);
+    }
+    return this;
+  }
+
+  /**
+   * @return If this {@link StringList} is case-sensitive,
+   * the same instance is returned. Otherwise, a new object is returned.
+   */
+  public StringList toCaseSensitive() {
+    if (!isCaseSensitive()) {
+      return new StringList(true, tokens);
+    }
+    return this;
+  }
 }