首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将字符串分成2-4个长块?

如何将字符串分成2-4个长块?
EN

Stack Overflow用户
提问于 2019-09-07 16:42:48
回答 4查看 104关注 0票数 2

我需要将一个数字串(例如2005002193401)分割成最长为4的块。所以我做了以下工作:

代码语言:javascript
复制
String numbers = "2005002193401";
while (numbers.length() > 4) {
  System.out.print(numbers.substring(0, 4) + " ");
  numbers = numbers.substring(4);
}
System.out.println(numbers);

这给了我以下信息:2005 0021 9340 1

现在我的问题是。这些块的长度应该至少为2(最多为4),最好不要以0开头。更像这样:200 500 219 3401200 500 2193 401

我已经四处看过了,但什么都找不到真正的解决办法.

有人知道一个简单的方法吗?

EN

回答 4

Stack Overflow用户

发布于 2019-09-07 18:43:00

有趣的任务。下面是Kotlin的解决方案:

代码语言:javascript
复制
fun main(args: Array<String>) {
    println(trickySplit("2005002193401")?.joinToString("-"))
}

fun trickySplit(s: String): LinkedList<String>? {
    if (s.isEmpty()) return LinkedList()

    return s.splitUsing(headSize = 4) ?: 
           s.splitUsing(headSize = 3) ?: 
           s.splitUsing(headSize = 2)
}

fun String.splitUsing(headSize: Int): LinkedList<String>? {
    return toHeadAndTail(headSize)
            ?.takeUnless { it.second.startsWith("0") }
            ?.let { it.first addToList trickySplit(it.second) }
}

fun String.toHeadAndTail(headSize: Int): Pair<String, String>? {
    return if (length >= headSize) take(headSize) to drop(headSize) else null
}

infix fun String.addToList(list: LinkedList<String>?): LinkedList<String>? {
    list?.push(this)
    return list;
}

输出:200-5002-193-401

而到Java的翻译则稍微冗长一些:

代码语言:javascript
复制
public class TrickySplitter {
    public static void main(String[] arg) {
        new TrickySplitter().trickySplit("2005002193401")
                            .map(it -> String.join("-", it))
                            .ifPresent(System.out::println);
    }

    public Optional<LinkedList<String>> trickySplit(String s) {
        if (s.isEmpty()) return Optional.of(new LinkedList<>());

        return splitUsing(s, 4)
                .or(() -> splitUsing(s, 3))
                .or(() -> splitUsing(s, 2));

    }

    private Optional<LinkedList<String>> splitUsing(String s, Integer headSize) {
        return toHeadAndTail(s, headSize)
                .filter(headAndTail -> !headAndTail[1].startsWith("0"))
                .map(headNTail -> addToList(headNTail[0], trickySplit(headNTail[1]).orElse(null)));

    }

    private Optional<String[]> toHeadAndTail(String s, Integer headSize) {
        if (s.length() >= headSize) {
            return Optional.of(new String[]{s.substring(0, headSize), s.substring(headSize, s.length())});
        } else {
            return Optional.empty();
        }
    }

    private LinkedList<String> addToList(String s, LinkedList<String> list) {
        if (list != null) list.push(s);
        return list;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-07 19:11:22

我的Java解决方案如下所示。诚然,这不是一种聪明的方法,因为它残酷地贯穿了每一种可能性,并将那些有效的方法添加到解决方案中。但很管用。如果你不明白,我可以添加评论。

代码语言:javascript
复制
private static List<List<Integer>> solutions;

private static void dfs(List<Integer> nextIndexes[], Stack<Integer> currentRecord, int currentIndex) {
    if (currentIndex == nextIndexes.length) {
        List<Integer> result = new ArrayList<>(currentRecord);
        solutions.add(result);
        return;
    }
    for (int i = nextIndexes[currentIndex].size() - 1; i >= 0; i--) {
        int endingIndex = nextIndexes[currentIndex].get(i);
        currentRecord.push(endingIndex);
        dfs(nextIndexes, currentRecord, endingIndex + 1);
        currentRecord.pop();
    }
}

public static void generateSolutions(String number) {
    ArrayList<Integer> nextIndexes[] = new ArrayList[number.length()];
    for (int i = 0; i < number.length(); i++) {
        nextIndexes[i] = new ArrayList<>();
        if (number.charAt(i) == '0') {
            continue;
        }
        for (int j = 1; i + j < number.length() && j <= 3; j++) {
            nextIndexes[i].add(i + j);
        }
    }
    Stack<Integer> currentRecord = new Stack<>();
    solutions = new ArrayList<>();
    dfs(nextIndexes, currentRecord, 0);
}

public static void splitNumbers(String number) {
    generateSolutions(number);
    for (List<Integer> solution: solutions) {
        int beginIndex = -1;
        String answer = "";
        for (int index: solution) {
            answer += number.substring(beginIndex + 1, index + 1) + " ";
            beginIndex = index;
        }
        System.out.println(answer);
    }
}

public static void main(String[] args) {
    splitNumbers("10234056708208");
}

"10234056708208“的结果如下:

代码语言:javascript
复制
1023 4056 708 208 

1023 4056 70 8208 

1023 405 6708 208 

1023 405 670 8208 

1023 40 5670 8208 

1023 40 56 708 208 

1023 40 56 70 8208 

102 3405 6708 208 

102 3405 670 8208 

102 340 5670 8208 

102 340 56 708 208 

102 340 56 70 8208 

10 2340 5670 8208 

10 2340 56 708 208 

10 2340 56 70 8208 

10 23 4056 708 208 

10 23 4056 70 8208 

10 23 405 6708 208 

10 23 405 670 8208 

10 23 40 5670 8208 

10 23 40 56 708 208 

10 23 40 56 70 8208
票数 1
EN

Stack Overflow用户

发布于 2019-09-07 20:43:11

我想到的是,你可以用2或3除以数字的长度,这会给你有2或3个元素的部分的数目。然后得到其余的数字/部件除法。当最新除法的其余部分大于0时,向第1部分添加一个元素,然后继续。以下是一些代码:

代码语言:javascript
复制
int n = numbers.length();
int parts = n/3;
int leftover = n%parts;
int next = 0;
for (int i = 0; i < n - n/parts;) {
     i = next;
     if (leftover > 0) {
         leftover--;
         next+=n/parts + 1;
     } else {
         next+=n/parts;
     }
     System.out.print(numbers.substring(i, next) + ", ");
}

供您参考:

2005002193401

会给

2005,002,193,401

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57835650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档