我创建了一个名为listItem的类和以下列表:
List<listItem> myList = new List<listItem>();
Run Code Online (Sandbox Code Playgroud)
在我的代码中的某个时刻,我想将其转换为数组,从而使用:
listItem[] myArray = myList.ToArray();
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,我收到此错误消息:
Cannot convert [...] listItem[] to [...] List<listItem>
Run Code Online (Sandbox Code Playgroud)
我试图解决这个问题,但非常失败......
提前致谢.
编辑:我的坏,我写的第一个代码行确实是错误的!
实际上,上面的所有代码都运行良好.我的错误是由于我的功能:
List<listItem> myFunction()
Run Code Online (Sandbox Code Playgroud)
返回myArray,因此转换问题......现在已经修复了.:)
谢谢大家的答案.
我一直在学习如何使用java进行编程,而且我没有对LinkedLists toArray(T[] a)和toArray()方法的区别做出任何明确的解释.第二个只是将LinkedList对象中的所有元素作为数组返回,对吧?但是,第一个怎么样?
编辑:
我的意思是,我从oracle阅读文档,它说:
以适当的顺序返回包含此列表中所有元素的数组(从第一个元素到最后一个元素); 返回数组的运行时类型是指定数组的运行时类型.如果列表适合指定的数组,则返回其中.否则,将使用指定数组的运行时类型和此列表的大小分配新数组.如果列表适合指定的数组,并且空间足够(即,数组的元素多于列表),则紧跟在列表末尾的数组中的元素将设置为null.(仅当调用者知道列表不包含任何null元素时,这在确定列表长度时很有用.)
与toArray()方法一样,此方法充当基于数组的API和基于集合的API之间的桥梁.此外,该方法允许精确控制输出阵列的运行时类型,并且在某些情况下可以用于节省分配成本.
我不明白以粗体显示的句子的含义.
现在,我有:
public <T> T[] toArray(T[] old) {
T[] arr = Arrays.copyOf(old, old.length + size());
int i = old.length;
for(E obj : this) {
arr[i] = old.getClass().getComponentType().cast(obj);
++i;
}
return arr;
}
Run Code Online (Sandbox Code Playgroud)
(请注意,这不符合合同,因为axtavt指出了这一点.)
在哪里我得到这个警告:
Type safety: Unchecked cast from capture#2-of ? to T
Run Code Online (Sandbox Code Playgroud)
这仍然是实现它的最佳/最直接的方法吗?我可以以某种方式编码它而没有那个警告吗?我将如何实施呢?
编辑:我目前的解决方案.首先,我真的希望自己不要有这样的警告toArray.因此,我编写了这些小辅助函数(请在此处阅读以进一步讨论这些函数):
@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T obj) {
return (Class<? extends T>) obj.getClass();
}
@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T[] array) {
return (Class<? extends T>) array.getClass().getComponentType();
}
@SuppressWarnings("unchecked") static …Run Code Online (Sandbox Code Playgroud) 我发现了一个List对象的甲,然后我用Apache Commons Collection4所获得的变换List来自具有阿实例具有乙实例.
listOfBs = (List<B>) CollectionUtils.collect(listOfAs, componentTransformer);
Run Code Online (Sandbox Code Playgroud)
不过,最终我需要有一个Array的烧烤不是List.
所以我的问题是,哪个更快.
CollectionUtils.collectlistOfBs.toArray(new B[listOfBs.size()])要么
listOfAs第一种方法和第二种方法的区别在于第一种方法的代码少得多,但我不确定toArray方法是否隐藏了一个隐藏的循环或昂贵的操作.
我在第二种方法中看到的是,我确信我只会在listOfAs列表上循环一次.
那么哪种方法更快?
这应该是一个非常基本的问题,但我找到一个明确的答案时遇到了一些麻烦.
如果您有一个值数组并且使用该.ToArray()方法,它是否会创建数组的深层或浅层副本?
我正在使用Entity Framework从SQL中提取一些数据.
我写了一些看起来像下面的代码片段的代码.请注意,这Something是varchar数据库中的值.此外,我认为每个值Something包含十个数字,连字符,然后两个以上的数字可能是相关的,例如"0123456789-01".(不要提醒我这是糟糕的设计;我不是这个数据库的架构师.)
var X = Entities.MyView
.Select(x => x.Something)
.Distinct();
// 5850 elements
var Y = Entities.MyView
.GroupBy(x => x.Something);
// 5850 elements
var Z = Entities.MyView
.ToArray()
.GroupBy(x => x.Something);
// 5727 elements
// Added in response to user995219's Answer
var ZZ = Entities.MyView
.GroupBy(x => x.Something)
.ToArray();
// 5850 elements
Run Code Online (Sandbox Code Playgroud)
第一个语句Something从视图中下拉列的不同值MyView.它得到了结果5850元素,这是我所期望的.
第二个语句将整个视图拉下来并按唯一值对其进行Something分组,产生5850个分组,这正是我所期望的.
第三个语句完全相同,只是它调用ToArray了来自的值MyView.通常,当我希望调用代码使用整个数据并且不想处理任何延迟加载SNAFU时,我会这样做.但是,当我在调试器中运行此代码时,此第三个语句产生5727个分组,比我预期的少123个.
编辑:第四语句只是反转的顺序GroupBy和ToArray方法链接.做这个小改动,我得到了我期望的行数,但是这个问题无法通过这种方式解决的真正问题是因为真正的问题是将来自此SQL调用的数据与其他数据相关联并将它们返回到单个对象中的代码.
我希望了解使用是如何ToArray …
如果我有一个带孩子的反应组件并且我调用React.Children.toArray这些孩子,为什么数组中的对象的键前面有.$
var Child = React.createClass({
render: function() {
console.log(React.Children.toArray(this.props.children)[0].key);
return <div>{this.props.children}</div>
}
});
var Container = React.createClass({
render: function() {
return <Child><div key={1}>1</div></Child>
}
});
ReactDOM.render(<Container />, document.getElementById('container'));
Run Code Online (Sandbox Code Playgroud)
这会记录.$1到控制台。为什么密钥从 更改1为.$1?
我有一张地图
private HashMap<Character, Integer> map;
我想将它转换为数组但是当我这样做/我得到这个:
Entry<Character, Integer> t = map.entrySet().toArray();
**Type mismatch: cannot convert from Object[] to Map.Entry<Character,Integer>**
Run Code Online (Sandbox Code Playgroud)
Entry<Character, Integer>[] t = null;
map.entrySet().toArray(t);
**Exception in thread "main" java.lang.NullPointerException**
Run Code Online (Sandbox Code Playgroud)
Entry<Character, Integer>[] t = new Entry<Character, Integer>[1];
map.entrySet().toArray(t);
**Cannot create a generic array of Map.Entry<Character,Integer>**
Run Code Online (Sandbox Code Playgroud)
Entry<Character, Integer>[] t = null;
t = map.entrySet().toArray(t);
**Exception in thread "main" java.lang.NullPointerException**
Run Code Online (Sandbox Code Playgroud)
那么如何转换HashMap为Array?在其他科目中找不到任何答案.
我有一个有趣的 JSON 解析问题,至少对我来说是这样,因为我是第一次这样做。我有以下示例 JSON,我想将其映射到等效的 DTO:
{
"modules":
[
{
"name":"module1",
"shortId":23425,
"pmns":
[
{
"name":"pmn1",
"position":1,
"pmnType":"D3"
},
{
"name":"pmn3",
"position":3,
"pmnType":"R2"
},
{
"name":"pmn7",
"position":5,
"pmnType":"S1"
},
]
},
{
"name":"module2",
"shortId":1572,
"pmns":
[
{
"name":"pmn1",
"position":3,
"pmnType":"D3"
},
{
"name":"pmn12",
"position":35,
"pmnType":"R2"
},
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的 ModuleDTO 类:
public class ModuleDTO {
private String _name;
private short _shortId;
private PmnDTO[] _pmns;
public String getName() {
return _name;
}
public short getShortId() {
return _shortId;
}
public …Run Code Online (Sandbox Code Playgroud) 我有以下一段 IntelliJ 建议我应该更改的代码:
String[] normalizedNames = rawToNormalized.values().stream().toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)
进入
String[] normalizedAliases = rawToNormalized.values().toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)
Aleksey Shipil?v 的帖子 ( https://shipilev.net/blog/2016/arrays-wisdom-ancients/ ) 建议:
toArray(new T[0]) 看起来更快、更安全、更干净,因此现在应该是默认选择。”
可有人请详细说明究竟是如何toArray(new String[0])不同于toArray(String[]::new)由流去,并使用toArray无Collector。
可toArray(new String[0])仍然流中使用?它仍然是一个性能更高/更好的选择吗?
toarray ×10
java ×6
arrays ×3
c# ×2
collections ×2
list ×2
.net ×1
casting ×1
deep-copy ×1
dto ×1
group-by ×1
jackson ×1
java-8 ×1
java-stream ×1
javascript ×1
json ×1
linq ×1
map ×1
performance ×1
reactjs ×1
shallow-copy ×1
types ×1