从一道例题谈Arrays.toString()与其他String的转换方法

  阅读该篇文章前,请大家事先阅读一下:   java.toString(),(String),String.valueOf的区别

  

  有了上述基础后,我接下来谈谈从一道题目中获得的些许收获。

  今天在做题是发现了非常重要的一点。题目来源:http://www.lintcode.com/en/problem/anagrams/

  我们先来看一下两种不同的解法:

解法一:

/*
 use int[26] assuming it‘s all lowercase letters
 count each string char in a letter array int[], convert the array into string.
 HashMap carray string as key, and actualy string as value
 outupt all values
*/
public class Solution {
    public List<String> anagrams(String[] strs) {
        List<String> rst = new ArrayList<String>();

        if (strs == null || strs.length == 0) {
            return rst;
        }

        HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

        for (int i = 0; i < strs.length; i++) {
            int[] arr = new int[26];
            for (int j = 0; j < strs[i].length(); j++) {
                arr[strs[i].charAt(j) - ‘a‘] += 1;
            }

            String arrString =  Arrays.toString(arr);
            //    不能使用String.valueOf(arr);
            if (!map.containsKey(arrString)) {
                map.put(arrString, new ArrayList<String>());
            }
            map.get(arrString).add(strs[i]);
        }

        //Output
        for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) {
            if (entry.getValue().size() >= 2)
                rst.addAll(entry.getValue());
        }

        return rst;
    }
}

解法二:

/*
    Feels like put into a hashmap of each string‘s sorted version. <String, ArrayList<Sting>>
    compare each string. If match, add into it.
    reurn all that has >= 2 items
*/
public class Solution {
    public List<String> anagrams(String[] strs) {
            List<String> rst = new ArrayList<String>();

            if (strs == null || strs.length == 0) {
                return rst;
            }

            HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

            for (int i = 0; i < strs.length; i++) {
                char[] arr = strs[i].toCharArray();
                Arrays.sort(arr);
                String s = String.valueOf(arr);
                //    不能使用arr.toString(), 但是可以用Arrays.toString(arr);
                if (!map.containsKey(s)) {
                    ArrayList<String> list = new ArrayList<String>();
                    map.put(s, list);
                }
                map.get(s).add(strs[i]);
            }
            //check instance occurs >= 2
            for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) {
                if (entry.getValue().size() >= 2) {
                    rst.addAll(entry.getValue());
                }
            }
            return rst;
    }
}

     这边我们不讨论该题目的具体解法(解法思路我已经写在了注释中,若还有可以去我的GitHub下载,对应的程序:LintCode-Anagrams.java)。

  我们可以发现,在第一种解法中,我定义了一个int[]用来存储每个字符出现的个数。当我想要将它转换为String时,我第一次使用了String.valueOf(arr)这个方法

  但是这是错误的。根据上面的总结我们可以得知String.valueOf()这个方法实际上在toString()方法的基础上实现的。故我们来看看int[],我们发现它并没有重写toString方法,

故默认情况下,它所返回的应该是该整形数组的内存地址。所以在这里,我们不管是调用String.valueOf(arr)还是arr.toString()方法结果都是一样的,并且都是错误的,它并不能

够实现将整形数组转换为字符串。但是!Arrays.toString()不一样,Arrays是一个工具类。在java中类似的Collections,Arrays等是工具类,目的是为了方便开发人员们对其进行操作。

API中Arrays的描述是:

  • This class contains various methods for manipulating arrays (such as sorting and searching). This class also contains a static factory that allows arrays to be viewed as lists.

该类中的所有方法为静态的,可以直接调用操作。所以,我们来看一下Arrays.toString(int[])方法的描述:

  • Returns a string representation of the contents of the specified array. The string representation consists of a list of the array‘s elements, enclosed in square brackets ("[]"). Adjacent elements are separated by the characters ", " (a comma followed by a space). Elements are converted to strings as by String.valueOf(int). Returns "null" if a is null

并且我们可以发现该方法还对int[], short[], double[], char[]等这些数据都实现了重写。故我们可以放心地调用该方法为我们实现将一个数组转换为字符串。

注:Arrays作为一个工具类还包含其他许多好用的方法,如:sort(),fill()...等

  在解法二中,我们定义了一个char[], 用来存储经过Arrays.sort()排序的字符数组。将它转换为字符串的时候,我们看到了它使用了String.valueOf(arr)这个方法。这时候我们不禁纳闷,

为什么第种解法中就能够使用该方法呢?原因在于,String.valueOf()方法实现了对char[]类型的重写,查阅API我们可以发现,存在方法:

  public static String valueOf(char[] data)   并且该方法的描述是:

  • Returns the string representation of the char array argument. The contents of the character array are copied; subsequent modification of the character array does not affect the newly created string.

由此可以我们可以用过该方法将字符串数组转换成字符串,但是并不能够使用arr.toString()方法将其转换为字符串。因为char[]并没有重写该方法(若要实现目的,可以自己人为地重写该方法)。同时我们可以

发现String.valueOf()方法仅实现了valueOf(int), valueOf(float)...等这些方法,并没有对int[], float[]这些类型进行实现。这个说明了在第一个解法中,我们是不能够调用String.value(arr)来实现我们的目的的。

  至此,对于该问题的分析已经结束了。总结如下:

  1. 将数组转换为一个字符串时最好利用Java提供的Arrays工具类来实现,该类中封装了许多高效的代码。多使用它们可以为开发工作带来不少便利,亦能够提高开发效率。
  2. 要熟悉Java的API,如String类中并没有实现valueOf(int [])方法,盲目调用并不能够达到我们想要的目的。
时间: 2024-10-04 18:35:30

从一道例题谈Arrays.toString()与其他String的转换方法的相关文章

Arrays.toString(a)---&gt;将数组a的值转换为字符串

Arrays.toString(数组)是java内置类Arrays类的一个方法,具体查Api可知.因为数组是不可直接输出的,它的作用是将数组转换为字符串.其实用for循环也是可以做到的,只不过比for循环省事. Arrays.toString(数组),输出数组成员 public class Demo { static String[] a={"Tom","jack"}; public static void main(String[] args) { System.

一道例题的详解

实现中等难度通讯录.需求: 1.定义联系人类AddressContact.实例变量:姓名(拼音,?字母大写).性别.电话号码.住址.分组名称.年龄.?法:?定义初始化方法(姓名.电话号码).显?联系人信息 2.在main.m中定义字典,分组管理所有联系人.分组名为26个?写的英文字母. 3.可以添加联系人对象,如果姓名或电话号码为空,添加失败.添加联系人到匹配的分组. 4.获取某个分组名称下所有联系人,并且按照姓名升序排列. 5.从通讯录中根据电话号码搜索联系人. 6.获取所有女性的联系人,并且

JavaSE8基础 Arrays.toString 将一维int数组转成字符串输出

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku2; import java.util.Arrays; public class Demo100 { public static void main(String[] args) { String str = Arrays.toString(new int[] { 1, 2,

第十一章 Arrays.toString( ... )产生数组的可打印表示

打印容器无需任何帮助,直接打印容器对象即可获得容器内可视数据,但是对于数组,直接打印数组对象,最终是调用toString方法,打印出的只是: * @return a string representation of the object. */ public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 类名@HashCode. package 持有对

Arrays.toString() 的用法

在做项目的时候很想看一下数组里面具体放的数据,于是我直接打印了数组,但是结果是输出的居然是数组的地址,咕~~(╯﹏╰)b 于是查了一下,怎样才能将数组输出,找到了Arrays.toString() ,下面是在Arrays类里面这个方法的具体实现方法,我们不用管具体是怎么实现的,只要会使用就可以啦. public class MaoPao2 { public static void main(String[] args) { int[] nums = {76, 23, 9, 8, 88}; for

字符数组的ss.toString()和new String(ss)的问题

int[] a={0, 1, 1, 2, 8, 4, 9}; System.out.println(String.valueOf(a));-----类型+句柄 System.out.println(a.toString());----------类型+句柄 System.out.println(Arrays.toString(a));----[0, 1, 1, 2, 8, 4, 9] System.out.println(new String(a));------参数错误 char[] ss={

C#类型转换obj.ToString()、Convert.ToString(obj)、(string)obj、obj as string差异

C#下有4中方式可将一个对象转换为string: object obj = ""; string str; str = obj.ToString(); str = Convert.ToString(obj); str = (string)obj; str = obj as string; 1. 前两种方法用于得到一个对象的string表示,如DateTime类型转string类型,一般自定义对象会重写ToString()方法: 2. 区别在于若obj=null,obj.ToString

浅谈Arrays.asList()方法的使用

首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表链接起来,当更新其中之一时,另一个自动更新 (3)不支持add和remove方法 上代码: 1 package com.hdu.test; 2 3 import java.util.Arrays; 4 import java.util.List; 5 6 abstract public class

第三十八天-一道例题企业级备份方案

一.例题 某公司里有一台web服务器,里面的数据很重要,但是如果硬盘坏了,数据就会丢失,现在领导要求你把数据备份,这样web服务器数据丢失可以进行恢复. 要求如下: 每天晚上00点整在web服务器A上打包备份系统配置文件.网站程序目录及访问日志,并通过rsync命令推送到服务器B上备份保留(备份的思路可以是先在本地按日期打包,然后再推到备份服务器B上). 问题一:实现web服务器A数据备份到服务器B 要求如下: 1.web服务器A和备份服务器B的备份目录必须都为/backup 2.系统配置文件包