任何人都可以帮助我并告诉我如何将
char
数组转换为列表,反之亦然。
我正在尝试编写一个程序,用户在其中输入一个字符串(例如 "Mike is good"
),并在输出中,每个空格都被 "%20"
替换(即 "Mike%20is%20good"
)。虽然这可以通过多种方式完成,但由于插入和删除在链表中需要 O(1) 时间,所以我想尝试使用链表。我正在寻找某种方法将 char
数组转换为列表,更新列表,然后将其转换回来。
public class apples
{
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
StringBuffer sb = new StringBuffer(input.nextLine());
String s = sb.toString();
char[] c = s.toCharArray();
//LinkedList<char> l = new LinkedList<char>(Arrays.asList(c));
/* giving error "Syntax error on token " char",
Dimensions expected after this token"*/
}
}
因此,在这个程序中,用户输入字符串,我将其存储在
StringBuffer
中,我首先将其转换为字符串,然后转换为char
数组,但我无法获取列表l
来自 s
。
如果有人能告诉我将
char
数组转换为列表的正确方法,反之亦然,我将非常感激。
String
的方法chars()
:
myString.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
如果您需要将
char[]
转换为 List<Character>
,您可以先从中创建一个 String
,然后应用上述解决方案。虽然它的可读性和美观度不是很高,但它会很短。
因为 char 是原始类型,所以标准
Arrays.asList(char[])
不起作用。它将生成 List<char[]>
代替 List<Character>
...所以剩下的就是迭代数组,并用该数组中的数据填充新列表:
public static void main(String[] args) {
String s = "asdasdasda";
char[] chars = s.toCharArray();
// List<Character> list = Arrays.asList(chars); // this does not compile,
List<char[]> asList = Arrays.asList(chars); // because this DOES compile.
List<Character> listC = new ArrayList<Character>();
for (char c : chars) {
listC.add(c);
}
}
这就是将列表转换回数组的方法:
Character[] array = listC.toArray(new Character[listC.size()]);
有趣的是为什么
List<char[]> asList = Arrays.asList(chars);
会这样做:asList
可以采用数组或 vararg。在这种情况下,char [] chars
被视为char[]
的单值可变参数!所以你也可以写类似
List<char[]> asList = Arrays.asList(chars, new char[1]);
:)
Guava 的 Chars.asList() 方法。那么将字符串转换为字符链接列表的代码就是:
LinkedList<Character> characterList = new LinkedList<Character>(Chars.asList(string.toCharArray()));
或者,以更番石榴的方式:
LinkedList<Character> characterList = Lists.newLinkedList(Chars.asList(string.toCharArray()));
Guava 库包含很多好东西,因此值得将其包含在您的项目中。
char[] myCharArray = { 'H', 'e', 'l', 'l', 'o', '-', 'X', 'o', 'c', 'e' };
Stream<Character> myStreamOfCharacters = IntStream
.range(0, myCharArray.length)
.mapToObj(i -> myCharArray[i]);
List<Character> myListOfCharacters = myStreamOfCharacters.collect(Collectors.toList());
myListOfCharacters.forEach(System.out::println);
List<Character> list = s.chars().mapToObj( c -> (char)c).collect(Collectors.toList());
泛型参数不能是原始类型。
但是如果你只是想进行替换,有一些方法(即
java.lang.String
的replaceAll)可以为你做到这一点
private static String replaceWhitespaces(String string, String replacement) {
return string != null ? string.replaceAll("\\s", replacement) : null;
}
你可以这样使用它:
StringBuffer s = new StringBuffer("Mike is good");
System.out.println(replaceWhitespaces(s.toString(), "%20"));
输出:
Mike%20is%20good
所有操作都可以在java 8或以上版本中完成:
从给定字符串到字符数组
char[] characterArray = myString.toCharArray();
从给定的字符串中获取字符列表
ArrayList<Character> characterList
= (ArrayList<Character>) myString.chars().mapToObj(c -> (char)c).collect(Collectors.toList());
从给定的字符串中获取字符集 注意:集合仅存储唯一值。因此,如果您只想从字符串中获取唯一字符,可以使用此方法。
HashSet<Character> abc =
(HashSet<Character>) given.chars().mapToObj(c -> (char)c).collect(Collectors.toSet());
从给定字符串中获取特定范围内的字符: 获取unicode值大于118的字符。 https://symbl.cc/en/unicode-table/#basic-latin
字符的 ASCII 代码值 * a-z - 97 - 122 * A-Z - 65 - 90
given.chars().filter(a -> a > 118).mapToObj(c -> (char)c).forEach(a -> System.out.println(a));
它将返回字符:w,x,v,z过滤器中的ascii值可以与字符一起玩。您可以对过滤器中的字符进行操作,然后您可以将它们收集到列表中或根据您的需要进行设置
public ArrayList<Character> wordToList () {
char[] brokenStr = "testing".toCharArray();
ArrayList<Character> result = new ArrayList<Character>();
for (char ch : brokenStr) {
result.add(ch);
}
return result;
}
List<Character> charlist = String.copyValueOf(arrChr)
.chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toList());
List<Character> characterList = String.valueOf(chars).chars().mapToObj(i -> (char) i).toList();