Golang等多種語言轉(zhuǎn)數(shù)組成字符串舉例詳解
Python
python語言中沒有普通的數(shù)組,使用list類代替。轉(zhuǎn)字符串非常方便,基本上所有的對(duì)象都有相應(yīng)的內(nèi)置方法__repr__()可以把obj轉(zhuǎn)成對(duì)應(yīng)的字串,對(duì)應(yīng)的內(nèi)置函數(shù)為 repr()。
>>> help(repr)
Help on built-in function repr in module builtins:repr(obj, /)
Return the canonical string representation of the object.
For many object types, including most builtins, eval(repr(obj)) == obj.
示例:
>>> a = [1,2,3,4] >>> b = [[1, 2],[3, 4],[5, 6]] >>> c = [[1, 2], [3, 4], [5, [7,8,9]]] >>> repr(a) '[1, 2, 3, 4]' >>> repr(b) '[[1, 2], [3, 4], [5, 6]]' >>> repr(c) '[[1, 2], [3, 4], [5, [7, 8, 9]]]'
一維列表轉(zhuǎn)字符串
.join()方法 + 列表推導(dǎo)式(看作是簡版的循環(huán)遍歷):
>>> a = [1, 2, 3, 4] >>> "[" + ",".join(str(elem) for elem in a) + "]" '[1,2,3,4]'
更 Pythonic 的寫法:
>>> a = [1,2,3,4]
>>> ",".join(map(str,a)).join("[]")
'[1,2,3,4]'二維列表轉(zhuǎn)字符串
>>> b = [[1,2],[3,4]]
>>> ",".join(",".join(map(str,a)).join("[]") for a in b).join("[]")
'[[1,2],[3,4]]'多維列表轉(zhuǎn)字符串
可以自定義一個(gè)遞歸函數(shù)來模擬__repr__()的實(shí)現(xiàn):
>>> from typing import List
>>> def List2Str(s):
if not s:
return '[]'
pieces = []
for item in s:
if isinstance(item, List):
pieces.append(List2Str(item))
else:
pieces.append(str(item))
return ','.join(pieces).join('[]')
>>> a = [1, 2, 3, 4]
>>> b = [[1, 2], [3, 4]]
>>> c = [[1, 2], [3, 4], [5, [7, 8, 9]]]
>>> List2Str(a)
'[1,2,3,4]'
>>> List2Str(b)
'[[1,2],[3,4]]'
>>> List2Str(c)
'[[1,2],[3,4],[5,[7,8,9]]]'對(duì)python來說,其實(shí)是不需要轉(zhuǎn)換的,大可直接使用repr(), str(), print()來處理列表,也不用管列表元素是什么數(shù)據(jù)類型,非常省心。
Golang
go語言沒有現(xiàn)成的list,vector容器類,只有數(shù)組和切片,可以被直接打印,但是用空格分隔的:
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4}
b := [][]int{{1, 2}, {3, 4}, {5, 6, 7}}
fmt.Println(a)
fmt.Println(b)
}輸出:
[1 2 3 4]
[[1 2] [3 4] [5 6 7]]
非要用逗號(hào)分隔,用strings.ReplaceAll()來替換,這種方法可以用在任意維數(shù)組上。
package main
import (
"fmt"
"strings"
)
func main() {
a := []int{1, 2, 3, 4}
b := [][]int{{1, 2}, {3, 4}, {5, 6, 7}}
str := strings.ReplaceAll(fmt.Sprint(a), " ", ",")
fmt.Println(str)
str = strings.ReplaceAll(fmt.Sprint(b), " ", ",")
fmt.Println(str)
}輸出:
[1,2,3,4]
[[1,2],[3,4],[5,6,7]]
對(duì)于一維數(shù)組,也有類似python中.join()方法:
package main
import (
"fmt"
"strings"
)
func main() {
a := []int{1, 2, 3, 4}
str := strings.Join(strings.Fields(fmt.Sprint(a)), ",")
fmt.Println(str)
}一維數(shù)組的遍歷打印
?package main
import "fmt"
func ArrayToString(arr []int) string {
res := "["
for i := 0; i < len(arr); i++ {
res += fmt.Sprint(arr[i]) //對(duì)[]int數(shù)組可以用strconv.Itoa(arr[i])
if i != len(arr)-1 {
res += ","
}
}
return res + "]"
}
func main() {
arr := []int{1, 2, 3, 4, 5}
fmt.Println(ArrayToString(arr))
}二維數(shù)組的遍歷打印
package main
import "fmt"
func Array2DToString(array [][]int) string {
if len(array) == 0 {
return "[]"
}
arr2str := func(arr []int) string {
res := "["
for i, ar := range arr {
res += fmt.Sprint(ar)
if i != len(arr)-1 {
res += ","
}
}
return res + "]"
}
res := "["
for i, arr := range array {
res += arr2str(arr)
if i != len(array)-1 {
res += ","
}
}
return res + "]"
}
func main() {
arr := [][]int{{1, 2}, {3, 4}, {5, 6, 7}}
fmt.Println(Array2DToString(arr))
}或者:
package main
import (
"fmt"
"strings"
)
func Array2DToString(array [][]int) string {
if len(array) == 0 {
return "[]"
}
arr2str := func(arr []int) string {
res := "["
for i := 0; i < len(arr); i++ {
res += fmt.Sprint(arr[i])
if i != len(arr)-1 {
res += ","
}
}
return res + "]"
}
res := make([]string, len(array))
for i, arr := range array {
res[i] = arr2str(arr)
}
return strings.Join(strings.Fields(fmt.Sprint(res)), ",")
}
func main() {
arr := [][]int{{1, 2}, {3, 4}, {5, 6, 7}}
fmt.Println(Array2DToString(arr))
}以上示例代碼輸出的都是緊湊形式[1,2,3,4],喜歡有空格如[1, 2, 3, 4],可以在以上代碼中用", "代替","。
Java
一維容器的直接打印
java的數(shù)據(jù)類型超級(jí)豐富,甚至可以說是泛濫成災(zāi)了。容器類可以直接打印,普通數(shù)組不行:
import java.util.*;
public class main {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4};
System.out.println(a);
Integer[] b = {1, 2, 3, 4};
System.out.println(b);
List<Integer> c = Arrays.asList(b);
System.out.println(c);
Vector<Integer> d = new Vector<>(c);
System.out.println(d);
}
}輸出:
[I@123a439b
[Ljava.lang.Integer;@7de26db8
[1, 2, 3, 4]
[1, 2, 3, 4]
二維容器的直接打印
import java.util.*;
public class main {
public static void main(String[] args) {
Integer[][] arrays = {{1, 2}, {3, 4}};
List<List<Integer>> list = new ArrayList<>();
for (Integer[] array1D : arrays) {
list.add(new ArrayList<>(Arrays.asList(array1D)));
}
Vector<Vector<Integer>> vector = new Vector<>();
for (Integer[] array1D : arrays) {
vector.add(new Vector<>(Arrays.asList(array1D)));
}
System.out.println(list);
System.out.println(vector);
}
}輸出:
[[1, 2], [3, 4]]
[[1, 2], [3, 4]]
普通數(shù)組的轉(zhuǎn)化
也非常方便,有現(xiàn)成的Arrays.toString()函數(shù)可用,二維及以上數(shù)組則要用deepToString()。不需要循環(huán)遍歷就能實(shí)現(xiàn),如需要的話請(qǐng)參考上面go語言中的遍歷實(shí)現(xiàn)方法。
import java.util.*;
public class main {
public static void main(String[] args) {
Integer[] array1D = {1, 2, 3, 4};
Integer[][] array2D = {{1, 2}, {3, 4}};
int[][][] array3D = {{{1, 2}, {3, 4}}, {{11, 12}, {13, 14}}};
String str1 = Arrays.toString(array1D);
String str2 = Arrays.deepToString(array2D);
String str3 = Arrays.deepToString(array3D);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}輸出:
[1, 2, 3, 4]
[[1, 2], [3, 4]]
[[[1, 2], [3, 4]], [[11, 12], [13, 14]]]
C++
C++98開始有vector容器,但在C++中容器和數(shù)組都不能被直接打印。
遍歷方法與golang中的基本相同:
一維容器的遍歷
1. to_string()
#include <vector>
#include <sstream>
#include <iostream>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
string str = "[";
for (int i = 0; i < v.size(); ++i) {
str += to_string(v[i]);
if (i != v.size() - 1) {
str += ", ";
}
}
str += "]";
cout << str << endl;
return 0;
}2. stringstream
#include <vector>
#include <sstream>
#include <iostream>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
stringstream ss;
ss << "[";
for (int i = 0; i < v.size(); ++i) {
ss << v[i];
if (i != v.size() - 1) {
ss << ", ";
}
}
ss << "]";
cout << ss.str() << endl;
return 0;
}數(shù)組也能直接遍歷,或者先把 array轉(zhuǎn)vector 再遍歷:
int arr[] = {1, 2, 3, 4, 5};
std::vector<int> vec(std::begin(arr), std::end(arr));二維容器的遍歷
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
vector<vector<int>> vec2d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
stringstream ss;
ss << "[";
for (int i = 0; i < vec2d.size(); ++i) {
ss << "[";
for (int j = 0; j < vec2d[i].size(); ++j) {
ss << vec2d[i][j] << ", ";
}
ss.seekp(-2, ios_base::end); //省掉判斷:j==vec2d[i].size()-1
ss << "], ";
}
ss.seekp(-2, ios_base::end); //省掉判斷:i==vec2d.size()-1
ss << "]";
cout << ss.str() << endl;
return 0;
}使用copy()省掉for循環(huán):
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <sstream>
using namespace std;
int main()
{
vector<int> vec1d = {1, 2, 3, 4, 5};
copy(vec1d.begin(), vec1d.end(), ostream_iterator<int>(cout, " "));
cout << endl;
stringstream ss;
ss << "[";
copy(vec1d.begin(), vec1d.end(), ostream_iterator<int>(ss, ","));
ss.seekp(-1, ios_base::end);
ss << "]";
cout << ss.str() << endl;
return 0;
}都寫成轉(zhuǎn)換函數(shù):
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <sstream>
using namespace std;
string VectorToString(vector<int> vec, string sep = ",")
{
stringstream ss;
ss << "[";
copy(vec.begin(), vec.end(), ostream_iterator<int>(ss, sep.c_str()));
ss.seekp(-(int)sep.size(), ios_base::end);
ss << "]";
return ss.str();
}
string Vector2dToString(vector<vector<int>> vec2d, string sep = ",")
{
stringstream ss;
ss << "[";
for (int i = 0; i < vec2d.size(); ++i) {
ss << "[";
copy(vec2d[i].begin(), vec2d[i].end(), ostream_iterator<int>(ss, sep.c_str()));
ss.seekp(-(int)sep.size(), ios_base::end);
ss << "]" << sep;
}
ss.seekp(-(int)sep.size(), ios_base::end);
ss << "]";
return ss.str();
}
int main()
{
vector<int> vec1d = {1, 2, 3, 4, 5};
vector<vector<int>> vec2d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
cout << VectorToString(vec1d) << endl;
cout << Vector2dToString(vec2d) << endl;
cout << VectorToString(vec1d, ", ") << endl;
cout << Vector2dToString(vec2d, ", ") << endl;
return 0;
}輸出:
[1,2,3,4,5]
[[1,2,3],[4,5,6],[7,8,9]]
[1, 2, 3, 4, 5]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
簡要小結(jié)
本文主要介紹了在 Python、Golang、Java 和 C++ 這些常見的編程語言中,數(shù)組/容器轉(zhuǎn)化為字符串的方法。
在 Python 中,可以通過 for 循環(huán)或者列表推導(dǎo)式來遍歷數(shù)組或列表,并通過 join() 方法將其轉(zhuǎn)化為字符串。
在 Golang 中,可以使用 for 循環(huán)或 range 關(guān)鍵字和切片操作符進(jìn)行一維和二維數(shù)組的遍歷,并通過 fmt 包中的 Sprintf() 函數(shù)將其轉(zhuǎn)化為字符串。
在 Java 中,可以使用 foreach 循環(huán)進(jìn)行一維和二維數(shù)組的遍歷,并使用 Arrays.toString() 函數(shù)將一維數(shù)組轉(zhuǎn)化為字符串,使用 Arrays.deepToString() 函數(shù)將二維數(shù)組轉(zhuǎn)化為字符串。
在 C++ 中,可以使用 for 循環(huán)、迭代器和 range 循環(huán)等多種方法進(jìn)行一維和二維容器的遍歷,并通過 std::to_string() 函數(shù)和 std::stringstream 類將容器轉(zhuǎn)化為字符串。
總結(jié)
到此這篇關(guān)于Golang等多種語言轉(zhuǎn)數(shù)組成字符串的文章就介紹到這了,更多相關(guān)Golang數(shù)組轉(zhuǎn)字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談?dòng)肎o構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法
這篇文章主要介紹了用Go構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Go語言如何在Web服務(wù)中實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)
在這篇文章中,我們將通過一個(gè)簡單的例子來演示如何在 Go 語言中使用 Gin 框架實(shí)現(xiàn)優(yōu)雅關(guān)機(jī),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
總結(jié)Go語言中defer的使用和注意要點(diǎn)
Go語言中的defer關(guān)鍵字實(shí)現(xiàn)比較特殊的功能,這篇文章給大家總結(jié)了關(guān)于Go語言中defer的使用和注意要點(diǎn),有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-09-09
構(gòu)建go鏡像實(shí)現(xiàn)過程全面講解
這篇文章主要為大家介紹了構(gòu)建go鏡像實(shí)現(xiàn)過程全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解
在Golang中,大家必然會(huì)頻繁使用到函數(shù)(Function)和方法(Method),但是有的同學(xué)可能并沒有注意過函數(shù)和方法的異同點(diǎn),函數(shù)和方法都是用來執(zhí)行特定任務(wù)的代碼塊,雖然很相似,但也有很大的區(qū)別,所以本文將詳細(xì)講解函數(shù)和方法的定義以及它們的異同點(diǎn)2023-07-07

