[ https://issues.apache.org/jira/browse/GROOVY-11655?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17949857#comment-17949857 ]
ASF GitHub Bot commented on GROOVY-11655: ----------------------------------------- paulk-asert commented on code in PR #2215: URL: https://github.com/apache/groovy/pull/2215#discussion_r2076518594 ########## src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java: ########## @@ -1877,6 +1878,77 @@ public static StringBuilder leftShift(final StringBuilder self, final Object val return self; } + //-------------------------------------------------------------------------- + // make StringBuilder behaves like a stack of chars + + /** + * Since StringBuilder is a basic dynamic container of chars, sometimes it should + * behave like a stack of chars at the same time. + * stack's methods should have: push(), peek(), pop(), size(), isEmpty() + * <pre class="groovyTestCase"> + * def st = new StringBuilder() + * // stack in cases: + * st.push('B') + * assert st.toString() == 'B' + * st.push('a') + * assert st.toString() == 'Ba' + * st.push('r') + * assert st.toString() == 'Bar' + * assert st.size() == 3 + * assert st.isEmpty() == false + * // stack out cases: + * assert st.peek() == 'r' as char + * assert st.pop() == 'r' as char + * assert st.toString() == 'Ba' + * assert st.peek() == 'a' as char + * assert st.pop() == 'a' as char + * assert st.toString() == 'B' + * assert st.size() == 1 + * assert st.isEmpty() == false + * assert st.pop() == 'B' as char + * assert st.isEmpty() == true + * </pre> + * + * @param self a StringBuilder obj + * @param ch a char to push in + * @return the StringBuilder obj self + * @since 5.0.0 + */ + public static StringBuilder push(final StringBuilder self, final char ch) { + Objects.requireNonNull(self); + self.append(ch); + return self; + } + + public static StringBuilder push(final StringBuilder self, final String ch) { + Objects.requireNonNull(self); + self.append(ch); + return self; + } + + public static StringBuilder push(final StringBuilder self, final GString ch) { + Objects.requireNonNull(self); + self.append(ch); + return self; + } + + public static char peek(final StringBuilder self) { + Objects.requireNonNull(self); + assert self.length() > 0; + return self.charAt(self.length() - 1); + } + + public static char pop(final StringBuilder self) { + char last = peek(self); + self.setLength(self.length() - 1); + return last; + } + + public static int size(final StringBuilder self) { Review Comment: This is provided by #size(CharSequence) already. > Create extension method to make StringBuilder like a stack > ---------------------------------------------------------- > > Key: GROOVY-11655 > URL: https://issues.apache.org/jira/browse/GROOVY-11655 > Project: Groovy > Issue Type: New Feature > Reporter: John > Priority: Major > > for leetcode problem: > [https://leetcode.com/problems/design-a-text-editor/description/] > the java code below, suppose StringBuilder to be a contain of chars , > meanwhile as a stack. > > {code:java} > class TextEditor { > private final StringBuilder left = new StringBuilder(); > private final StringBuilder right = new StringBuilder(); > public void addText(String text) { > left.append(text); > } > public int deleteText(int k) { > k = Math.min(k, left.length()); > left.setLength(left.length() - k); > return k; > } > public String cursorLeft(int k) { > while (k > 0 && !left.isEmpty()) { > right.append(left.charAt(left.length() - 1)); > left.setLength(left.length() - 1); > k--; > } > return text(); > } > public String cursorRight(int k) { > while (k > 0 && !right.isEmpty()) { > left.append(right.charAt(right.length() - 1)); > right.setLength(right.length() - 1); > k--; > } > return text(); > } > private String text() { > > return left.substring(Math.max(left.length() - 10, 0)); > } > } > {code} > > -- This message was sent by Atlassian Jira (v8.20.10#820010)