[ https://issues.apache.org/jira/browse/GROOVY-11655?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17950160#comment-17950160 ]
Paul King edited comment on GROOVY-11655 at 5/8/25 1:34 AM: ------------------------------------------------------------ The other Groovy idiomatic way to solve this would be to create a custom stack: {code:groovy} class TextEditor { private left = new StringBuilderStack(), right = new StringBuilderStack() void addText(String text) { left.append(text) } int deleteText(int k) { [k, left.size()].min().tap{ left.length -= it } } String cursorLeft(int k) { while (k > 0 && left) { right.push(left.pop()) k-- } text() } String cursorRight(int k) { while (k > 0 && right) { left.push(right.pop()) k-- } text() } private String text() { left.takeRight(10) } } class StringBuilderStack extends Stack<Character> { private @Delegate StringBuilder sb = new StringBuilder() @Override Character push(Character ch) { sb.append(ch) ch } @Override Character peek() { sb[-1] } @Override Character pop() { char last = sb[-1] sb.length -= 1 last } void setLength(int length) { sb.setLength(length) } int getLength() { sb.length() } @Override int size() { sb.size() } } new TextEditor().with { addText('leetcode') // leetcode| assert deleteText(4) == 4 // leet| addText('practice') // leetpractice| assert cursorRight(3) == 'etpractice' // leetpractice| assert cursorLeft(8) == 'leet' // leet|practice assert deleteText(10) == 4 // |practice assert cursorLeft(2) == '' // |practice assert cursorRight(6) == 'practi' // practi|ce } {code} was (Author: paulk): The other Groovy idiomatic way to solve this would be to create a custom stack: {code:groovy} class TextEditor { private left = new StringBuilderStack(), right = new StringBuilderStack() void addText(String text) { left.append(text) } int deleteText(int k) { [k, left.size()].min().tap{ left.length -= it } } String cursorLeft(int k) { while (k > 0 && left) { right.push(left.pop()) k-- } text() } String cursorRight(int k) { while (k > 0 && right) { left.push(right.pop()) k-- } text() } private String text() { left.takeRight(10) } } class StringBuilderStack extends Stack<Character> { private @Delegate StringBuilder sb = new StringBuilder() Character push(Character ch) { sb.append(ch) ch } Character peek() { sb[-1] } Character pop() { char last = sb[-1] sb.length -= 1 last } void setLength(int length) { sb.setLength(length) } int getLength() { sb.length() } int size() { sb.size() } } new TextEditor().with { addText('leetcode') // leetcode| assert deleteText(4) == 4 // leet| addText('practice') // leetpractice| assert cursorRight(3) == 'etpractice' // leetpractice| assert cursorLeft(8) == 'leet' // leet|practice assert deleteText(10) == 4 // |practice assert cursorLeft(2) == '' // |practice assert cursorRight(6) == 'practi' // practi|ce } {code} > 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)