`
oaklet
  • 浏览: 109056 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

操作String的几个Method

    博客分类:
  • java
阅读更多
    public static String join(String[] array, String sep) {
        if (array == null) {
            return null;
        }
        if (array.length == 0) {
            return "";
        }
        if (sep == null) {
            sep = "";
        }
        // 预处理,得到长度。
        int capacity = 0;
        for (int i = 0; i < array.length; i++) {
            array[i] = String.valueOf(array[i]);
            capacity = capacity + array[i].length() + sep.length();
        }
        char[] result = new char[capacity - sep.length()];
        int begin = 0;
        for (int i = 0; i < array.length; i++) {
            array[i].getChars(0, array[i].length(), result, begin);
            begin = begin + array[i].length();
            if (begin == result.length) {
                break;
            }
            sep.getChars(0, sep.length(), result, begin);
            begin = begin + sep.length();
        }
        return new String(result);
    }

使用结果:
StringExt.join(null, *)                = null
StringExt.join([], *)                  = ""
StringExt.join([null], *)              = "null"
StringExt.join(["a", "b", "c"], "--")  = "a--b--c"
StringExt.join(["a", "b", "c"], null)  = "abc"
StringExt.join(["a", "b", "c"], "")    = "abc"
StringExt.join([null, "", "a"], ",")   = "null,,a"

第二个
    public static String join2(String[] array, String sep) {
        if (array == null) {
            return null;
        }
        if (array.length == 0) {
            return "";
        }
        if (sep == null) {
            sep = "";
        }
        StringBuilder sb = new StringBuilder();
        for (String tkey : array) {
            sb.append(tkey);
            sb.append(sep);
        }
        int len = sb.length();
        sb.delete(len - sep.length(), len);
        return sb.toString();
    }

两个join使用结果是一样了,第一个可能快一点点,第二个看起来更简捷。
org.apache.commons.lang.StringUtils中有相似的方法。

    /**
     * 
     * @param source
     * @param separator
     * @return
     */
    public static String[] split(String source, String... separator) {
        if (source == null) {
            return null;
        }
        if (source.length() == 0) {
            return new String[] { "" };
        }
        if (separator == null) {
            return splitfields(source, null, -1);
        }
        ArrayList<String> result = new ArrayList<String>();
        char[] arrsource = source.toCharArray();
        char[][] arrseps = new char[separator.length][];
        for (int i = 0; i < arrseps.length; i++) {
            arrseps[i] = separator[i].toCharArray();
            if (arrseps[i].length == 0) {
                return splitfields(source, null, -1);
            }
        }

        int preend = 0;
        int begin = 0;
        boolean cansep = false;
        int end = 0;
        for (int i = 0; i < arrsource.length; i++) {
            begin = i;
            NextSep: for (int j = 0; j < arrseps.length; j++) {
                end = i + arrseps[j].length;
                if (end > arrsource.length) {
                    cansep = false;
                    continue;
                }
                int m = i, n = 0;
                for (; m < arrsource.length && n < arrseps[j].length; m++, n++) {
                    if (arrsource[m] != arrseps[j][n]) {
                        cansep = false;
                        continue NextSep;
                    }
                }
                cansep = true;
                break;
            }
            if (cansep) {
                int len = begin - preend;
                char[] preChar = new char[len];
                System.arraycopy(arrsource, preend, preChar, 0, len);
                result.add(new String(preChar));

                preend = end;
                cansep = false;
                i = end - 1;
                begin = i;
            }
        }
        int len = begin - preend + 1;
        char[] preChar = new char[len];
        System.arraycopy(arrsource, preend, preChar, 0, len);
        result.add(new String(preChar));

        return result.toArray(new String[0]);
    }

使用结果:
StringExt.split(null, *)                      = null
StringExt.split("", *)                        = [""]
StringExt.split("ab de fg", null)             = ["ab", "cd", "ef"]
StringExt.split("ab    de fg", null)          = ["ab", "cd", "ef"]
StringExt.split("ab de fg", null)       = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "")               = ["ab", "cd", "ef"]
StringExt.split("ab    de fg", "")            = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "")         = ["ab", "cd", "ef"]
StringExt.split("ab de fg", *, "")             = ["ab", "cd", "ef"]
StringExt.split("ab    de fg", *, "")          = ["ab", "cd", "ef"]
StringExt.split("ab de fg", *, "")       = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "", *)             = ["ab", "cd", "ef"]
StringExt.split("ab    de fg", "", *)          = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "", *)       = ["ab", "cd", "ef"]
StringExt.split("ab:cd:ef", ":")              = ["ab", "cd", "ef"]
StringExt.split("ab,,,cd,,,ef", ",,,")        = ["ab", "cd", "ef"]
StringExt.split("ab,,,cd;;;ef", ",,,", ";;;") = ["ab", "cd", "ef"]
StringExt.split("ab,,,,,,ef", ",,,")          = ["ab", "", "ef"]

split中的分割符可以是多个,为了分割文件方便。
org.apache.commons.lang.StringUtils中有相似的split方法,但是用来分割csv格式的文件,不是太好用,如:
1;2;3;4;5
a;b;;d;e
9;8;7;6;5
如果要用“;”分割,第二列就对不齐,把每二列中分割为空的扔掉了,不明白apache为啥要这样实现,难道是为了跟String.split保持一致?
    public static String[] split(String source) {
        return split(source, null, -1);
    }

    public static String[] split(String source, String sep) {
        return split(source, sep, -1);
    }

    public static String[] split(String source, String sep, int maxsplit) {
        if (source == null) {
            return null;
        }
        if (source.length() == 0) {
            return new String[] { "" };
        }
        if (sep != null && sep.length() != 0)
            return splitfields(source, sep, maxsplit);

        ArrayList<String> list = new ArrayList<String>();
        char[] chars = source.toCharArray();
        int n = chars.length;
        if (maxsplit < 0)
            maxsplit = n;

        int splits = 0;
        int index = 0;
        while (index < n && splits < maxsplit) {
            while (index < n && Character.isWhitespace(chars[index]))
                index++;
            if (index == n)
                break;
            int start = index;

            while (index < n && !Character.isWhitespace(chars[index]))
                index++;
            list.add(source.substring(start, index));
            splits++;
        }
        while (index < n && Character.isWhitespace(chars[index]))
            index++;
        if (index < n) {
            list.add(source.substring(index, n));
        }
        return list.toArray(new String[0]);
    }

    private static String[] splitfields(String source, String sep, int maxsplit) {
        ArrayList<String> list = new ArrayList<String>();
        int length = source.length();
        if (maxsplit < 0)
            maxsplit = length;

        int lastbreak = 0;
        int splits = 0;
        int sepLength = sep.length();
        while (splits < maxsplit) {
            int index = source.indexOf(sep, lastbreak);
            if (index == -1)
                break;
            splits += 1;
            list.add(source.substring(lastbreak, index));
            lastbreak = index + sepLength;
        }
        if (lastbreak <= length) {
            list.add(source.substring(lastbreak, length));
        }
        return list.toArray(new String[0]);
    }


    public static String[] splitlines(String source) {
        return splitlines(source, false);
    }
    
    public static String[] splitlines(String source, boolean keepends) {
        ArrayList<String> list = new ArrayList<String>();

        char[] chars = source.toCharArray();
        int n = chars.length;

        int j = 0;
        for (int i = 0; i < n;) {
            /* Find a line and append it */
            while (i < n && chars[i] != '\n' && chars[i] != '\r'
                    && Character.getType(chars[i]) != Character.LINE_SEPARATOR)
                i++;

            /* Skip the line break reading CRLF as one line break */
            int eol = i;
            if (i < n) {
                if (chars[i] == '\r' && i + 1 < n && chars[i + 1] == '\n')
                    i += 2;
                else
                    i++;
                if (keepends)
                    eol = i;
            }
            list.add(source.substring(j, eol));
            j = i;
        }
        if (j < n) {
            list.add(source.substring(j, n));
        }
        return list.toArray(new String[0]);
    }


splitlines按行分割,换行符可以是“\n”或“\r\n”。
org.apache.commons.lang.StringUtils中也有相似的方法。
以上方法有些是自己实现的,有些是从源码中Copy的。

对齐的实现,左对齐,右对齐等
    public static String ljust(String src, int width) {
        return expand(src, width, ' ', true);
    }

    public static String rjust(String src, int width) {
        return expand(src, width, ' ', false);
    }

    public static String ljust(String src, int width, char fillchar) {
        return expand(src, width, fillchar, true);
    }

    public static String rjust(String src, int width, char fillchar) {
        return expand(src, width, fillchar, false);
    }

    public static String expand(String src, int width, char fillchar, boolean postfix) {
        String result = src;
        if (result.length() < width) {
            char[] temp = new char[width - result.length()];
            for (int i = 0; i < temp.length; i++) {
                temp[i] = fillchar;
            }
            if (postfix) {
                result = result + new String(temp);
            } else {
                result = new String(temp) + result;
            }
        }
        return result;
    }


替换的实现,嘿嘿,很搞笑吧:
    public static String repalce(String source, String oldStr, String newStr) {
        String[] split = split(source, oldStr);
        return join(split, newStr);
    }






广


分享到:
评论

相关推荐

    Java反射之Constructor、Method、Field使用及说明

    int length = (int) method.invoke(new String("Hello")); ``` ##### Field `Field`类表示类的字段。可以通过`Class`对象获取字段,并使用`set`和`get`方法修改或获取字段值。 ```java Class&lt;?&gt; clazz = Class....

    Springmvc : Failed to convert property value of type 'java.lang.String' to int

    解决这个问题有几种策略: 1. **验证输入**:在尝试转换之前,先检查输入是否为有效整数。可以使用Java内置的`Integer.parseInt()`或`Integer.valueOf()`方法,它们会抛出异常如果输入无效。或者使用Apache Commons...

    C# FTP操作最全类 WPF实现

    我们将讨论以下几个关键知识点: 1. **FTP基础**: FTP是一个应用层协议,它允许用户从远程服务器上下载文件或向服务器上传文件。FTP协议基于TCP,通过控制连接和数据连接进行通信。在C#中,我们可以利用System...

    Java问题宝典2012版

    创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? String有没有length()这个方法? 26 ...

    真正通用的操作日志系统设计

    客户端的设计需要考虑以下几个方面: - **API设计**:定义清晰的API接口规范,支持各种编程语言调用。 - **安全性**:确保数据传输过程中的安全性。 - **易用性**:提供详尽的文档和支持,帮助开发者快速上手。 ##...

    (补充)操作数据库的几种方法_配合girdview使用遍历数据

    如果需要更复杂的逻辑,可以重写GridView的SelectMethod,返回一个IQueryable或IEnumerable对象,然后在代码中进行数据操作。 总结,操作数据库并配合GridView显示数据是.NET Web应用程序中的常见任务。选择合适的...

    反射和序列化的几个简单示例

    本文将通过几个简单的C#示例来探讨这两个主题,帮助初学者更好地理解和运用。 **反射** 反射是.NET框架提供的一种强大机制,它允许程序在运行时检查自身,并动态地创建对象、调用方法或访问属性。以下是一些使用...

    struts2通配符的使用详解

    大括号内的数字(如`{1}`)表示星号后的第几个参数,这里代表第一个星号后的内容。 - `&lt;result&gt;/user_{1}.jsp&lt;/result&gt;`:定义了Action执行完毕后转向的视图资源,即以`user_`加上前面星号后的第一个参数命名的JSP...

    几个java例子程序代码

    Java程序由类(class)组成,每个类都包含方法(method)。程序的入口点是`main`方法,这是程序执行的起点。例如,一个简单的"Hello, World!"程序如下: ```java public class HelloWorld { public static void ...

    java基础测试题

    根据给定文件的信息,我们可以将其中的几个Java基础测试题目的知识点进行详细的解析与扩展。 ### 题目一 **题目描述**:检查以下包含内部类的代码: ```java public final class Test4 { class Inner { void ...

    C#实现反射调用动态加载的DLL文件中的方法

    该类中包含几个不同的方法,例如`WriteString`、`WriteName`(静态方法)以及`WriteNoPara`(无参数方法)。 ```csharp using System; namespace Webtest { public class ReflectTest { public string ...

    JAVA反射机制原理剖析配经典例子,以及模拟DBUTIL发射实现的JDBC操作包自己写的一个DEMO.★

    这里我们简单描述一下DBUTIL的几个关键步骤: 1. **获取数据库驱动的Class对象**:通过`Class.forName()`加载指定的数据库驱动,如`com.mysql.jdbc.Driver`。 2. **建立数据库连接**:使用`DriverManager.get...

    java基础学习内容

    反射主要涉及以下几个方面: - **获取类的信息**:如构造器(Constructor)、方法(Method)和字段(Field)等。 - **动态创建对象**:通过构造器创建对象。 - **调用方法**:通过Method对象调用对象的方法。 - **...

    反射机制的文档

    Java反射机制主要提供了以下几个关键功能: 1. **判断任意对象所属的类**:可以获取到一个对象的类信息。 2. **构造任意一个类的对象**:可以根据类信息创建该类的新实例。 3. **判断任意一个类所具有的成员变量和...

    封装过程中遇到的问题记录

    这里,我们将深入探讨在封装过程中遇到的几个具体问题,并提供可能的解决方案。 1. **不兼容的模块分配错误**: 当在server端添加codec时,如果出现“incompatible assignment to mod:”的错误,这通常意味着...

    Java String类详解_动力节点Java学院整理

    4. JVM内存分配包括以下几个关键部分: - 程序计数器(Program Counter Register):记录每个线程当前执行的指令地址,如果是native方法则为空。 - 本地方法栈(Native Method Stack):为执行Java Native ...

    Java中的反射实现数据库操作

    总的来说,Java反射机制在数据库操作中的应用主要体现在以下几个方面: 1. 动态实例化对象,适应不同的数据模型。 2. 调用对象的通用方法,如CRUD操作。 3. 访问和修改对象的私有属性,对应数据库的字段。 4. 结合`...

    Delphi中记录文件的操作示范及详细介绍

    记录文件的基本操作主要包括打开、读取、写入和关闭等几个步骤。 1. **打开文件**:使用`AssignFile`和`Reset`或`Rewrite`函数。 - `AssignFile`: 关联文件名和文件变量。 - `Reset`: 打开文件用于读取。 - `...

    JAVA反射机制详解

    下面通过几个示例来具体说明如何使用反射来获取和调用对象的属性及方法。 1. **获取并读取非静态字段的值** ```java public Object getProperty(Object owner, String fieldName) throws Exception { Class&lt;?&gt; ...

    就几个反射的例子

    Constructor&lt;?&gt; constructor = clazz.getConstructor(String.class); Object obj = constructor.newInstance("Hello, Reflection!"); ``` 反射也允许我们访问类的字段。`getFields()` 返回所有公共字段,而 `...

Global site tag (gtag.js) - Google Analytics