/** * @param indexOrder ( 1<= indexOrder <=n) * @return The matched string by the given pattern in the given it's order in the sorted list of matched String.<br> * <code>indexOrder</code> between 1 and <code>n</code> where <code>n</code> is the number of matched String.<br> If * indexOrder >= n , return an empty string. if there is an infinite number of String that matches the given Regex, * the method throws {@code StackOverflowError} */ public String getMatchedString(int indexOrder) { buildRootNode(); if (indexOrder == 0) indexOrder = 1; String result = buildStringFromNode(rootNode, indexOrder); result = result.substring(1, result.length() - 1); return result; }
/** * @param indexOrder * ( 1<= indexOrder <=n) * @return The matched string by the given pattern in the given it's order in the sorted list of matched String.<br> * <code>indexOrder</code> between 1 and <code>n</code> where <code>n</code> is the number of matched String.<br> * If indexOrder >= n , return an empty string. if there is an infinite number of String that matches the given Regex, the method throws * {@code StackOverflowError} */ public String getMatchedString(int indexOrder) { buildRootNode(); if (indexOrder == 0) indexOrder = 1; String result = buildStringFromNode(rootNode, indexOrder); result = result.substring(1, result.length() - 1); return result; }
private String buildStringFromNode(Node node, int indexOrder) { String result = ""; long passedStringNbr = 0; long step = node.getNbrMatchedString() / node.getNbrChar(); for (char usedChar = node.getMinChar(); usedChar <= node.getMaxChar(); ++usedChar) { passedStringNbr += step; if (passedStringNbr >= indexOrder) { passedStringNbr -= step; indexOrder -= passedStringNbr; result = result.concat("" + usedChar); break; } } long passedStringNbrInChildNode = 0; if (result.length() == 0) passedStringNbrInChildNode = passedStringNbr; for (Node childN : node.getNextNodes()) { passedStringNbrInChildNode += childN.getNbrMatchedString(); if (passedStringNbrInChildNode >= indexOrder) { passedStringNbrInChildNode -= childN.getNbrMatchedString(); indexOrder -= passedStringNbrInChildNode; result = result.concat(buildStringFromNode(childN, indexOrder)); break; } } return result; }
private String buildStringFromNode(Node node, int indexOrder) { String result = ""; long passedStringNbr = 0; long step = node.getNbrMatchedString() / node.getNbrChar(); for (char usedChar = node.getMinChar(); usedChar <= node.getMaxChar(); ++ usedChar) { passedStringNbr += step; if (passedStringNbr >= indexOrder) { passedStringNbr -= step; indexOrder -= passedStringNbr; result = result.concat("" + usedChar); break; } } long passedStringNbrInChildNode = 0; if (result.length() == 0) passedStringNbrInChildNode = passedStringNbr; for (Node childN : node.getNextNodes()) { passedStringNbrInChildNode += childN.getNbrMatchedString(); if (passedStringNbrInChildNode >= indexOrder) { passedStringNbrInChildNode -= childN.getNbrMatchedString(); indexOrder -= passedStringNbrInChildNode; result = result.concat(buildStringFromNode(childN, indexOrder)); break; } } return result; }