我将以下数据存储在" .txt"文件:
Dave,40,04/05/1978
Scott,34,05/06/1986
Sam,24,04/05/1978
Love,32,04/06/1989
Harry,29,04/06/1989
我已使用BufferedReader
进行阅读,拆分(使用,
)并将其存储在String[] stringArray
中。
现在stringArray[0]
将有名称,stringArray[1]
将有号码,stringArray[2]
将有日期。
我现在正在构建一个HashMap
,如下所示,将关键字显示为日期(String
),将值List
显示为具有相同日期的Member
出生
预期产出:
DOBMap: {04-05-1978=[[Dave,40],[Same,24]], 05/06/1986=[[Scott,34]], 04/06/1989=[[Love,32],[Harry,29]]
我有Member
,其中包含以下变量:
private String name;
private String no;
private String DOB;
由于我是收藏新手,我正在寻求帮助以实现此DOBMap
输出。
答案 0 :(得分:1)
我认为您可以通过使用Java Stream API(https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html)做得更好。 在这里,我假设您的Memeber类具有构造函数:
Member(String[] array)
在下列情况下:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import static java.util.stream.Collectors.groupingBy;
public class SO1 {
public static void main(String[] args) {
String filePath = ".../src/main/resources/SO1.txt";
try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
Map<String, List<Member>> map = lines
.map(line -> line.split(","))
.map(Member::new)
.collect(groupingBy(Member::getDOB));
System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印:
{05/06/1986=[Member{name='Scott', no='34', dob='05/06/1986'}], 04/05/1978=[Member{name='Dave', no='40', dob='04/05/1978'}, Member{name='Sam', no='24', dob='04/05/1978'}], 04/06/1989=[Member{name='Love', no='32', dob='04/06/1989'}, Member{name='Harry', no='29', dob='04/06/1989'}]}
可以说,这段代码的意图比明确迭代的代码更清晰。
答案 1 :(得分:0)
您可以遍历所有成员并将其插入HashMap
。我在这个例子中使用了ArrayList
,但如果你愿意,我可以用常规数组重写它。
因此,假设您有一个名为members
的ArrayList。
// members is an ArrayList of Member objects
HashMap<String, ArrayList<ArrayList<String>>> dobMap = new HashMap<>();
for (Member m : members) {
String[] temp = {m.getName(), m.getNo()}; // e.g. [Dave, 40]
// already in the map, so just push it to the existing ArrayList in there
if (dobMap.containsKey(m.getDOB())) {
dobMap.get(m.getDOB()).add(temp); // e.g. [[Dave, 40]].add([Sam, 24])
} else { // not in the map yet, so push a new ArrayList to that spot
ArrayList<String[]> temp2 = new ArrayList<>();
temp2.add(temp); // e.g. [[Dave, 40]]
dobMap.put(m.getDOB(), temp2);
}
}
稍微不同的解决方案(使用ArrayList
ArrayList
代替ArrayList
String[]
}:
HashMap<String, ArrayList<ArrayList<String>>> dobMap = new HashMap<>();
for (Member m : members) {
ArrayList<String> temp = new ArrayList<>();
temp.add(m.getName());
temp.add(m.getNo());
if (dobMap.containsKey(m.getDOB())) {
dobMap.get(m.getDOB()).add(temp);
} else {
ArrayList<ArrayList<String>> temp2 = new ArrayList<>();
temp2.add(temp);
dobMap.put(m.getDOB(), temp2);
}
}
通过它,您只需运行System.out.println(dobMap);
并查看结果与您的预期完全一致。从第一个解决方案打印HashMap
将需要一些努力来打印HashMap
的内容,因为它不会像ArrayList
那样打印常规数组。但他们都以同样的方式存储信息。
但我认为不应存储ArrayList
ArrayList
,而应将其存储为ArrayList
Member
。所以我将展示第三种解决方案,即:
HashMap<String, ArrayList<Member>> dobMap = new HashMap<>();
for (Member m : members) {
if (dobMap.containsKey(m.getDOB())) {
dobMap.get(m.getDOB()).add(m);
} else {
ArrayList<Member> temp = new ArrayList<>();
temp.add(m);
dobMap.put(m.getDOB(), temp);
}
}
然后在toString()
中覆盖Member
,如下所示:
@Override
public String toString() {
return String.format("[%s, %s]", this.name, this.no);
}
这第三种解决方案似乎最为明确。
在此示例中,我使用以下Member
类作为基础:
class Member {
private String name, no, dob;
public Member(String name, String no, String dob) {
this.name = name;
this.no = no;
this.dob = dob;
}
public String getName() { return this.name; }
public String getNo() { return this.no; }
public String getDOB() { return this.dob; }
}
如何定义ArrayList
Member
个// parts is an array of length 3 like you said
ArrayList<Member> members = new ArrayList<>();
members.add(new Member(parts[0], parts[1], parts[2]);
对象的示例如下:
require 'vendor/autoload.php';
use Aws\S3\S3Client;
$s3 = S3Client::factory();
$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
$result = $s3->deleteObject(array(
'Bucket' => $bucket,
'Key' => $keyname
));