Java中如何将仅含字符的Object[]转为char[]?代码报错求助
解决Stack转char[]的编译错误问题
这个问题我之前也踩过坑!Java里确实没法直接把Object[]或者Character[]强制转换成char[]——因为基本类型数组和对应的包装类数组是完全不同的类型,编译器不支持这种直接转换,必须手动处理每个元素的拆箱操作。
为什么原来的代码报错?
Stack.toArray()返回的是Object[]数组,里面每个元素是Character对象,直接强转char[]会触发类型不兼容错误。- 即使先转成
Character[],也没法直接转成char[],因为Java没有提供包装类数组到基本类型数组的自动转换,必须逐个把Character拆箱成char。
两种可行的解决方案
方案1:手动遍历转换(兼容所有Java版本)
利用Stack继承自Vector的特性,可以通过索引直接访问元素,然后逐个拆箱到char[]中:
char[] make(String s){ Stack<Character> st= new Stack<Character>(); for(char c:s.toCharArray()){ if(c!='#'){ st.push(c); } else if(!st.isEmpty()){ st.pop(); } } // 手动转换 char[] result = new char[st.size()]; for (int i = 0; i < st.size(); i++) { result[i] = st.get(i); // 按栈底到栈顶的顺序获取元素,和处理后的字符串顺序一致 } return result; }
方案2:使用Java 8+ Stream API(更简洁)
通过Stream的mapToChar方法自动拆箱,直接生成char[]:
char[] make(String s){ Stack<Character> st= new Stack<Character>(); for(char c:s.toCharArray()){ if(c!='#'){ st.push(c); } else if(!st.isEmpty()){ st.pop(); } } // Stream转换 return st.stream() .mapToChar(Character::charValue) // 拆箱成char .toArray(); }
修改后的完整代码
class Solution { char[] make(String s){ Stack<Character> st= new Stack<Character>(); for(char c:s.toCharArray()){ if(c!='#'){ st.push(c); } else if(!st.isEmpty()){ st.pop(); } } // 这里用Stream方案,也可以替换成手动遍历方案 return st.stream() .mapToChar(Character::charValue) .toArray(); } public boolean backspaceCompare(String S, String T) { char[] ch1=make(S); char[] ch2=make(T); if(ch1.length!=ch2.length) return false; for(int i=0;i<ch1.length;i++){ if(ch1[i]!=ch2[i]){ return false; } } return true; } }
补充说明
两种方案都能保证转换后的char[]顺序和处理后的字符串顺序一致——因为Stack.toArray()和st.get(i)都是按栈底到栈顶的顺序返回元素,和我们push的顺序一致,刚好对应处理后的正确字符序列。
内容的提问来源于stack exchange,提问作者Zenytt
相关产品推荐
相关产品推荐

