我有一项任务,要求我获取一个大型数据集,将其存储在一个数组中,然后创建以各种方式解释数据的方法。我给出的文件数据是这样的形式:
0 138
0 139
0 140
0 141
0 142
0 799
4 1
4 10
4 12
4 18
等......(非常大)
该数据应该代表人的社交网络,数字代表个人。每一行都包含左侧的人,他们“信任”右侧的人。我应该解释这些数据,以便我可以找到特定人信任的所有人,有多少人信任某个人,以及如何找到最信任的人。但是,我完全不知道如何编写这些方法,所以我想知道你们是否可以帮助我。这是我到目前为止的代码:
public class SocialNetwork {
static Scanner scanner = new Scanner(System.in);
static void findTrusted()
{
System.out.println("Please input person number you would like to find Trustees for");
trustee = (scanner.next());
}
public static void main(String[] args){
File inData = new File("dataset.txt");
ArrayList<Integer> links = new ArrayList<Integer>();
try
{
Scanner in = new Scanner(inData);
in.nextLine();
in.nextLine();
in.nextLine();
in.nextLine();
while (in.hasNext())
{
int trustee = in.nextInt();
int trusted = in.nextInt();
links.add(trustee);
links.add(trusted);
}
in.close();
}
catch (FileNotFoundException e){
e.printStackTrace();
}
}
}
正如您所看到的,我的findTrustee方法很少。我只是不知道从哪里开始。我想出了一个小伪代码来尝试解剖需要做的事情:
但是,我只是不知道该怎么做。
答案 0 :(得分:1)
结构links
并没有真正帮助你。它不知道“来自”和“来”。您将人员存储为数字,但不存储两个人之间的任何关系。你真的从事图论,你什么时候可以看一下图论的参考书和Java库。
那么,什么是信任链接?这个对象有两个人,受托人和值得信赖的人。为此创建一个类:
public class Trust {
private final int trustee;
private final int trusted;
public Trust(final int trustee, final int trusted) {
this.trustee = trustee;
this.trusted = trusted;
}
// Getters, equals, hashCode, toString, formatted output for humans.
}
让您的班级SocialNetwork
能够创建这些。顺便说一句,在main方法中创建一个SocialNetwork实例,并停止对其他所有内容使用static。
public Trust createTrust(Scanner scanner) {
int trustee = scanner.nextInt();
int trusted = scanner.nextInt();
return new Trust(trustee, trusted);
}
您可能需要添加异常处理和文件结束处理。
使links
列出Trust
个对象,然后根据需要编写扫描该列表的方法。
/**
Return a list of all the people who trustee trusts.
@param trustee A person in the system.
@return a list of the people trustee trusts.
*/
public List<Integer> trusting(int trustee) {
final List<Integer> trusted = new ArrayList<>();
for (Trust link: links) {
// Add something from link to trusted if it should.
// This looks like homework; I'm not doing everything for you.
}
return trusted;
}
根据需要编写其他方法。然后,考虑这些数据结构是否对此问题有效。 Map
会更好吗?来自其他图书馆的MultiMap
?某种开源图论库?也许您应该使用数据库。也许你应该有一个Person
类,而不是只使用整数;这样你就可以用他们的名字来标记人。
答案 1 :(得分:0)
我认为有很多方法可以实现这一点(无论性能如何)。例如,您可以使用HashMap,数组数组(或列表列表,如果您真的喜欢列表...)
我会举一个使用列表的例子,因为你似乎正在使用它......(虽然我认为这有点奇怪)
说,你有一个列表左边的人。
ArrayList<ArrayList> leftList = new ArrayList<ArrayList>();
对于leftList,循环直到达到最大值。左列(现在你可能会看到为什么数组/ HashMap更好......)做类似的事情:
leftList.add(new ArrayList());
在每个循环中。
然后你现在要做的就是阅读文件并将受托者列表插入对应于truster的rightList。例如。我有1 3,1 4和2 3;你的实现将实现如下:
leftList.get(1).add(3) / leftList.get(1).add(4) / leftList.get(2).add(3)
取决于您正在阅读的哪一行。
通过这种设置,我猜你可以很容易地解决这三个问题吗?否则,请在这里寻找更多建议。但请务必先考虑一下!
希望我的回答能给你一些想法。