基于指定字符串生成空心正方形的Java方法实现问题求助
Hey there! Let's work through fixing and optimizing your hollow square generator method. I'll start by breaking down the issues in your current code, then walk through a cleaner, rule-compliant implementation.
Issues in Your Current Code
- Missing String Extension Logic: Your code directly uses the input string
swithout handling cases where its length is shorter than the total required characters. This triggersStringIndexOutOfBoundsException(which you're hiding with a catch-alltry/catch), leading to unexpected or broken output. - Confusing Index Calculations: Variables like
p,zhave unclear purposes, and the math for character indices doesn't align with the "repeat string to补足" rule. For example, the bottom row logic pulls characters from the end of the original string backwards instead of using the repeated sequence. - Redundant Conditionals: Splitting the bottom row into
y == 1andy > 1adds unnecessary complexity, making the code hard to debug and maintain. - Hidden Errors: The catch-all exception handler swallows bugs instead of letting you identify and fix root causes (like index out-of-bounds issues).
Optimized Implementation
First, let's lock in the core rules we need to follow:
- Total required characters for a hollow square of side length
bis4*(b-1)(each side hasbcharacters, but the 4 corners are counted twice, so we subtract 4 duplicates). - Extend the input string by repeating it until it's long enough, then trim to the exact required length.
Here's the revised code:
public void patternMaker(int strLength, int sideLength, String patternStr) { // Calculate total characters needed for the hollow square int totalRequiredChars = 4 * (sideLength - 1); // Extend the input string to meet the total character requirement StringBuilder extendedStrBuilder = new StringBuilder(); while (extendedStrBuilder.length() < totalRequiredChars) { extendedStrBuilder.append(patternStr); } String extendedPattern = extendedStrBuilder.substring(0, totalRequiredChars); // Iterate over each row of the square for (int row = 0; row < sideLength; row++) { // Iterate over each column of the square for (int col = 0; col < sideLength; col++) { char output; if (row == 0) { // Top edge: left to right from the start of the extended string output = extendedPattern.charAt(col); } else if (row == sideLength - 1) { // Bottom edge: right to left from the end of the extended string output = extendedPattern.charAt(totalRequiredChars - 1 - col); } else if (col == 0) { // Left edge: top to bottom (excluding first/last rows) output = extendedPattern.charAt(totalRequiredChars - sideLength - row + 1); } else if (col == sideLength - 1) { // Right edge: top to bottom (excluding first/last rows) output = extendedPattern.charAt(sideLength - 1 + row); } else { // Hollow inner area: output space output = ' '; } // Print character with a space (matches your original formatting) System.out.print(output + " "); } // Move to next row System.out.println(); } }
Key Improvements
- Explicit String Extension: We build a properly extended string first, so we never hit index out-of-bounds errors and fully comply with the "repeat to补足" rule.
- Clear, Intentional Logic: Each conditional branch corresponds to a specific edge of the square, making the code easy to read and modify if you need to adjust character ordering.
- Descriptive Variable Names:
sideLength,extendedPatternmake the code self-documenting, unlike vague variables likea,b,p. - No Hidden Errors: We removed the catch-all exception handler so you can see and fix issues immediately if they arise.
Example Test Case
Let's test with sideLength=4, patternStr="abc":
- Total required characters:
4*(4-1)=12 - Extended string:
"abcabcabcabc" - Output:
a b c a b b c c c b a a
You can tweak the index math for edges if you need a specific character sequence order, but the core structure follows all your stated rules and is far easier to maintain than the original.
内容的提问来源于stack exchange,提问作者Turbo Dynamics
相关产品推荐
相关产品推荐

