任何人都可以帮助我并告诉如何将char
数组转换为列表,反之亦然。
我正在尝试编写一个用户输入字符串的程序(例如"Mike is good"
),在输出中,每个空格都被"%20"
替换(I "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
数组转换为列表的正确方法,反之亦然,我将非常感激。
答案 0 :(得分:33)
在Java 8及更高版本中,您可以使用String
's method chars()
:
myString.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
如果您需要将char[]
转换为List<Character>
,您可以先从String
创建<form data-abide>
<div class="name-field">
<label>Your name <small>required</small>
<input type="text" required pattern="[a-zA-Z]+">
</label>
<small class="error">Name is required and must be a string.</small>
</div>
<div class="email-field">
<label>Email <small>required</small>
<input type="email" required>
</label>
<small class="error">An email address is required.</small>
</div>
<input id="contactsubmit" class="button" type="submit" value="SEND" disabled>
</form>
,然后应用上述解决方案。虽然它不会非常易读和漂亮,但它会很短。
答案 1 :(得分:18)
因为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);
}
}
这就是你将List转换回数组的方式:
Character[] array = listC.toArray(new Character[listC.size()]);
有趣的是List<char[]> asList = Arrays.asList(chars);
完成它的工作原因:asList
可以采用数组或 vararg 。在这种情况下,char [] chars
被视为单值vararg char[]
!所以你也可以写一些像
List<char[]> asList = Arrays.asList(chars, new char[1]);
:)
答案 2 :(得分:12)
使用循环的另一种方法是使用Guava的Chars.asList()方法。然后将String转换为Character的LinkedList的代码就是:
LinkedList<Character> characterList = new LinkedList<Character>(Chars.asList(string.toCharArray()));
或者,以番石榴的方式:
LinkedList<Character> characterList = Lists.newLinkedList(Chars.asList(string.toCharArray()));
Guava库包含很多好东西,因此值得在项目中包含它。
答案 3 :(得分:3)
现在我将这个答案作为另一个选项发布给所有那些不允许使用任何lib但只有java 8的强大功能的开发人员:)
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);
答案 4 :(得分:1)
您不能在原始类型why?
的java中使用泛型如果你真的想转换为List并返回数组,那么dantuch的方法是正确的。
但是如果你只是想做替换,那里有一些方法(即java.lang.String
的{{3}})可以为你做这个
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
答案 5 :(得分:0)
所有操作都可以在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://unicode-table.com/en/#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值。您可以对过滤器中的字符进行操作,然后可以将其收集在列表中或根据需要进行设置
答案 6 :(得分:0)
我想最简单的方法是通过以下方式简单地遍历char数组并将每个元素添加到Characters的ArrayList中:
public ArrayList<Character> wordToList () {
char[] brokenStr = "testing".toCharArray();
ArrayList<Character> result = new ArrayList<Character>();
for (char ch : brokenStr) {
result.add(ch);
}
return result;
}
答案 7 :(得分:0)
列表构造函数是处理类型的另一种选择:
List filterList = Arrays.asList(jTextFieldFilterSet.getText().toCharArray());
答案 8 :(得分:0)
List strList = Stream.of( s.toCharArray() ).map( String::valueOf ).collect( Collectors.toList() );