- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经搜索了很多有关ArrayList类型的传递对象的信息,但没有找到解决我的问题的有用方法。这就是问题:
我有一个Vertex类(实现了Parcelable),它具有4个属性:名称(字符串),minDistance(双精度),上一个(顶点)和邻接的ArrayList(边的ArrayList)。
我还有一个Edge类(实现了Parcelable),它具有3种属性:from(Vertex),target(Vertex)和weight(double)。
在我的MainActivity中,我获得了一个顶点的ArrayList(每个顶点都有一个Arrays of Edges),并且我想将ArrayList传递给另一个 Activity 。此刻,我遇到了StackOverflowError。
类Vertex.java
public class Vertex implements Comparable<Vertex>, Parcelable {
public final String name;
public List<Edge> adjacencies = new ArrayList<Edge>();
public double minDistance = Double.POSITIVE_INFINITY;
public Vertex previous;
public Vertex(String argName) {
name = argName;
}
public Vertex(Parcel in) {
this.name = in.readString();
this.minDistance=in.readDouble();
Object[]aristas= in.readArray(Edge.class.getClassLoader());
setAdjacencies(aristas);
}
public void addEdge(Edge e) {
adjacencies.add(e);
}
public String toString() {
return name;
}
public int compareTo(Vertex other) {
return Double.compare(minDistance, other.minDistance);
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(name);
dest.writeDouble(minDistance);
Object[] edgesArray = adjacencies.toArray();
dest.writeArray(edgesArray);
}
public static final Parcelable.Creator<Vertex> CREATOR = new Parcelable.Creator<Vertex>() {
public Vertex createFromParcel(Parcel in) {
return new Vertex(in);
}
public Vertex[] newArray(int size) {
return new Vertex[size];
}
};
public void setAdjacencies(Object[] edges) {
for (Object edge : edges) {
if (edge instanceof Edge) {
adjacencies.add((Edge) edge);
}
}
}
}
public class Edge implements Parcelable {
private Vertex from;
private Vertex target;
private double weigth;
public Edge(Vertex from, Vertex target, double weight) {
this.target = target;
this.weigth = weight;
this.from = from;
}
public Edge(Parcel in) {
this.weigth=in.readDouble();
this.target=(Vertex) in.readParcelable(getClass().getClassLoader());
this.from=(Vertex) in.readParcelable(getClass().getClassLoader());
}
public Vertex getTarget() {
return target;
}
public void setTarget(Vertex target) {
this.target = target;
}
public double getWeigth() {
return weigth;
}
public void setWeigth(double weigth) {
this.weigth = weigth;
}
public Vertex getFrom() {
return from;
}
public void setFrom(Vertex from) {
this.from = from;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return getFrom().toString() + " -> " + weigth + " -> "
+ getTarget().toString();
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeDouble(weigth);
dest.writeParcelable( target,flags);
dest.writeParcelable(from, flags);
}
public static final Parcelable.Creator<Edge> CREATOR = new Parcelable.Creator<Edge>() {
public Edge createFromParcel(Parcel in) {
return new Edge(in);
}
public Edge[] newArray(int size) {
return new Edge[size];
}
};
}
i.putParcelableArrayListExtra("LIST_VERTEX", ((MainActivity)getActivity()).getListaVertex());
nodos = getIntent().getParcelableArrayListExtra("LIST_VERTEX");
public class Edge implements Parcelable {
public String PKhash;
private Vertex from;
private Vertex target;
private double weigth;
public static HashMap<String, Vertex> _parentsFrom = new HashMap<String, Vertex>();
public static HashMap<String, Vertex> _parentsTarget = new HashMap<String, Vertex>();
public String get_PKhash() {
/* Return a unique identifier of your Edge object here */
return PKhash;
}
public Edge(Vertex from, Vertex target, double weight) {
this.target = target;
this.weigth = weight;
this.from = from;
this.PKhash=from.name+","+getWeigth()+","+target.name;
}
public Edge( Parcel in ) {
this.weigth = in.readDouble();
this.PKhash = in.readString();
Assert.assertTrue( (from = _parentsFrom.get( this.PKhash )) != null );
Assert.assertTrue( (target = _parentsTarget.get( this.PKhash )) != null );
}
public Vertex getTarget() {
return target;
}
public void setTarget(Vertex target) {
this.target = target;
}
public double getWeigth() {
return weigth;
}
public void setWeigth(double weigth) {
this.weigth = weigth;
}
public Vertex getFrom() {
return from;
}
public void setFrom(Vertex from) {
this.from = from;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return getFrom().toString() + " -> " + weigth + " -> "
+ getTarget().toString();
}
@Override
public int describeContents() {
// TODO Auto-generated method stubz
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeDouble(weigth);
this.PKhash="";
this.PKhash=from.name+","+getWeigth()+","+target.name;
dest.writeString(PKhash);
_parentsFrom.put(PKhash, from);
_parentsTarget.put( PKhash, target);
}
public static final Parcelable.Creator<Edge> CREATOR = new Parcelable.Creator<Edge>() {
public Edge createFromParcel(Parcel in) {
return new Edge(in);
}
public Edge[] newArray(int size) {
return new Edge[size];
}
};
}
public class Vertex implements Comparable<Vertex>, Parcelable {
public final String name;
public List<Edge> adjacencies = new ArrayList<Edge>();
public double minDistance = Double.POSITIVE_INFINITY;
public Vertex previous;
public Vertex(String argName) {
name = argName;
}
public Vertex(Parcel in) {
this.name = in.readString();
this.minDistance=in.readDouble();
Object[]aristas= in.readArray(Edge.class.getClassLoader());
setAdjacencies(aristas);
}
public void addEdge(Edge e) {
adjacencies.add(e);
}
public String toString() {
return name;
}
public int compareTo(Vertex other) {
return Double.compare(minDistance, other.minDistance);
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(name);
dest.writeDouble(minDistance);
Object[] edgesArray = adjacencies.toArray();
dest.writeArray(edgesArray);
}
public static final Parcelable.Creator<Vertex> CREATOR = new Parcelable.Creator<Vertex>() {
public Vertex createFromParcel(Parcel in) {
return new Vertex(in);
}
public Vertex[] newArray(int size) {
return new Vertex[size];
}
};
public void setAdjacencies(Object[] edges) {
for (Object edge : edges) {
if (edge instanceof Edge) {
adjacencies.add((Edge) edge);
}
}
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode();
}
}
最佳答案
您无需在Parcelable
中实现EdgeList
。实际上,据我了解,您根本不需要EdgeList
。只需按如下所示修改Vertex
类:
public List<Edge> adjacencies = new ArrayList<Edge>();
public Edge(Parcel in) {
name = in.getString();
minDistance = in.getDouble();
adjancencies = in.readParcelableArray(Edge.getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeDouble(minDistance);
pc.writeParcelableArray((ArrayList<? extends Parcelable>) adjacencies, flags);
}
Vertex
类中包含
Edge
成员,因为这可能会创建循环引用。请先在没有这些成员的情况下进行测试。
Edge
类中,请勿在
Vertex
中写对
writeToParcel()
成员的引用。相反,请尝试以下操作:
public class Edge implements Parcelable {
private Vertex from;
private Vertex target;
private double weigth;
static HashMap<Long, Vertex> _parentsFrom = new HashMap<Long, Vertex>();
static HashMap<Long, Vertex> _parentsTarget = new HashMap<Long, Vertex>();
public long get_PKhash() { /* Return a unique identifier of your Edge object here */ }
private ItemClass( Parcel in ) {
(...)
assertTrue( (from = _parentsFrom.remove( get_PKhash() )) != null );
assertTrue( (target = _parentsTarget.remove( get_PKhash() )) != null );
}
public void writeToParcel( Parcel p, int args ) {
(...)//Don't write to the parcel your from and target objects
_parentsFrom.put( this.get_PKhash, from);
_parentsTarget.put( this.get_PKhash, to);
}
}
Parcelable
实现中没有循环引用。上面的解决方案是一个棘手的解决方法,只有在您可以确保在应用程序中唯一标识每个边缘实例时,它才有效。
关于java - 可包裹物体的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20159632/
我想了解如何正确地从 Parcel 中读取空值。让我们看看我的用例: public class MyModel implements Parcelable { private Long id;
好吧,我知道我必须使用 JDBC 等,但我不确定如何将 jar 实现到我的代码中,我有一个基本代码来打开文件等,但我如何才能真正将 sqlite jar 与我的 java 一起合并类文件可以在任何地方
我想知道是否可以打包(或序列化)ClassLoader 以通过 Message 将其发送到 Android 中的另一个进程。 ClassLoader没有实现 Parcelable/Serializab
在上传到我的域时尝试让我的 SVG 出现在浏览器中时,我 - 类似于我拥有 的其他项目包裹安装 - 创建了一个 静态文件夹 我会将 SVG 文件放入的位置。它现在出现在浏览器中,但是,正在播放的“绘图
我有这样的东西: 我希望以最简单的方式实现这样的事情:
当我们使用一个独立的函数语句作为 IIFE 时,我们需要用 () 包装它以使其工作 // IFFE (function a(){ console.log('Hello') }()); // I
我正在为 WCF 开发一个 Java 客户端,并且模板运行良好。我最初使用的是 eclipse 的 Web 服务客户端项目,但后来发现 android 平台不支持所需的库。当时我打算使用 ksoap,
我希望将整行变为可点击。现在行看起来像 Group Obj
我有以下标记(使用 Bootstrap 4): .resource{ border:1px solid red; } tes
#parent{ max-width:1100px; margin: auto; border: 1px solid red; padding: 40px; } #ch
我正在尝试用自定义指令包裹 Angular 带的弹出框。 弹出窗口应该能够使用由使用我的指令的人提供的自定义模板,并且该模板应该能够使用 Controller 的范围。 对于范围部分,我发现我可以将
我有一个 HTML 页面,其中一个 div 包含另一个包含数据库(聊天系统)中所有用户的 div,但是 ul li 标签没有占用父 div 的整个宽度。这是预期结果的图像:http://prntscr
我正在尝试通过套接字将包裹发送到 Android 应用程序。客户端在 libbinder(c++) 中,服务器是一个必须重建包裹的 android 应用程序。我一直在寻找解决方案有一段时间了,但我不知
当我部署一个网站(有多个入口点,许多 HTML 文件)并且主机使用构建命令时:parcel build index.html aboutme.html。部署的网站给我一个 404 错误。但是,如果我在
在 Quarkus 中,异常映射器返回的实体似乎被包装在另一个实体中。 提供一个 JAX-RS 异常映射器,例如: @Provider public class WebhookExceptionMap
如果我设置 textLayer.wrapped = YES , 如何调整大小 textLayer包含包装的文本?即,我如何获得 textLayer 的新高度? 基本上,我想要类似 -[UILabel
您好,如果类有 anchor ,我会尝试用 anchor 包裹图像。 jQuery: if ( $(".views-row:has(a)").length) { var noderef = $
所以,我以前多次使用 Parcel,我从来没有遇到过问题。 这一次它抛出了一些关于 SemVer 版本控制的愚蠢错误,我真的很想找到解决这个问题的解决方案。 我开始了新项目:安装了 npm w/npm
我将 Kotlin 与 Anko 一起使用,我想向另一个 Activity 发送玩家列表。 class Player(var name: String?) { var score: Int = 0 i
我正在尝试使用 Parcelable 通过 Activity 传递数据。这是我的代码: public class Player implements Parcelable { public stati
我是一名优秀的程序员,十分优秀!