我在Java中实现了Graph数据结构。 这是我的实施:
package Graph;
import java.util.*;
import java.io.*;
public class Graphs
{
int size;
LinkedList<Integer>[] ll;
Graphs(int size)
{
this.size = size;
ll = new LinkedList[size];
for(int i=0; i<size; i++)
ll[i] = new LinkedList<Integer>();
}
public static void print(LinkedList lli)
{
for(Integer i: lli)
System.out.println(i);
//for(int i=0; i<lli.size(); i++)
// System.out.println(lli.get(i));
}
public static void addEdge(Graphs graph, int up, int to)
{
graph.ll[to].add(up);
}
public static void main(String args[])
{
int V=5;
Graphs graph = new Graphs(V);
addEdge(graph,1,2);
addEdge(graph,1,3);
addEdge(graph,2,3);
addEdge(graph,3,1);
addEdge(graph,3,2);
addEdge(graph,3,4);
addEdge(graph,4,3);
print(graph.ll[3]);
}
}
基本上我是为图创建一个LinkedLists数组,每个链表都是图的顶点。
但是,我得到的java.lang.Object无法在第24行转换为java.lang.Integer。对于为什么我收到此错误一无所知。关于我缺少什么的任何建议?
答案 0 :(得分:1)
声明这样的打印方法:
#home-arrow:hover
然后它会知道lli的内容是整数。
答案 1 :(得分:1)
您遇到的具体问题是您的打印功能:
public static void print(LinkedList lli){
for(Integer i: lli)
System.out.println(i);
}
LinkedList
是原始类型,这意味着您丢失了有关列表中存储的对象类型的类型信息。作为一般规则,raw types are a bad idea。我对你编写的代码感到非常惊讶,但只需说Integer i : lli
,当你在参数lli
提供Integer
时,LinkedList
中的每个对象都是LinkedList lli
就足够了没有这样的保证。
要确保此功能正常,请将LinkedList<Integer> lli
更改为ll = new LinkedList[size]
。这意味着lli中的每个对象都是Integer的一个实例,因此迭代不会失败。
当我尝试运行您的代码时,我的IDE会向我发出有关该行的警告
ArrayList<LinkedList<Integer>>
话说:
未选中的赋值:'java.util.LinkedList []'到'java.util.LinkedList&lt; java.lang.Integer&gt; []'
这表明这里发生了一些可疑的事情。
混合列表和数组使用泛型键入会有点麻烦 - 如果需要大小可变性,则只需执行列表列表就会更容易和更清晰,如果不需要,则可以使用多维数组。对于您的情况,这需要import java.util.*;
import java.io.*;
public class Graphs
{
int size;
ArrayList<LinkedList<Integer>> ll;
Graphs(int size)
{
this.size = size;
ll = new ArrayList<LinkedList<Integer>>();
for(int i=0; i<size; i++)
ll.add(new LinkedList<Integer>());
}
public static void print(LinkedList<Integer> lli)
{
for(Integer i: lli)
System.out.println(i);
//for(int i=0; i<lli.size(); i++)
// System.out.println(lli.get(i));
}
public static void addEdge(Graphs graph, int up, int to)
{
graph.ll.get(to).add(up);
}
public static void main(String args[])
{
int V=5;
Graphs graph = new Graphs(V);
addEdge(graph,1,2);
addEdge(graph,1,3);
addEdge(graph,2,3);
addEdge(graph,3,1);
addEdge(graph,3,2);
addEdge(graph,3,4);
addEdge(graph,4,3);
print(graph.ll.get(3));
}
}
等。
我们可以通过解决一般性问题来解决问题:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/CCLL"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#303e73"
android:orientation="vertical">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight=".3">
<ListView
android:isScrollContainer="false"
android:stackFromBottom="true"
android:inputType="textMultiLine"
android:maxLines="4"
android:background="#26315c"
android:id="@+id/messagesLV"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:transcriptMode="alwaysScroll"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="3"
android:background="#303e73"
android:orientation="horizontal">
<ImageButton
android:layout_gravity="center"
android:id="@+id/addimgbtn"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:scaleType="centerCrop"
android:padding="25dp"
android:background="#303e73"
android:src="@mipmap/whiteadd" />
<EditText
android:id="@+id/messageET"
android:layout_weight=".5"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:isScrollContainer="true"
android:minHeight="120dp"
android:textColorHint="#FFFFFF"
android:inputType="textMultiLine"
android:hint="Enter your Message..." />
<ImageButton
android:id="@+id/sendbtn"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:scaleType="centerCrop"
android:padding="25dp"
android:background="#303e73"
android:src="@mipmap/whitesend" />
</LinearLayout>
答案 2 :(得分:0)
我复制了你的代码,直到我改变了
才编译public static void print(LinkedList lli)
为:
public static void print(LinkedList<Integer> lli)
从哪里工作没有问题
同时为变量提供一个以大写字母开头的名称与命名约定相对。看看this oracle tutorial。页面上的最后一个要点指出:
如果您选择的名称只包含一个单词,则拼写全部小写字母。如果它由多个单词组成,则将每个后续单词的首字母大写。名称gearRatio和currentGear是此约定的主要示例。