- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下问题:
我有一个 TreeMap,其中字符串作为键,以 ArrayList 形式的集合作为值。在字符串中,我保存了一家汽车租赁公司的客户姓名,在数组列表中,我获得了他们曾经租过的所有汽车名称。例如:
史密斯:[奥迪、宝马、马自达]米勒:[奥迪、法拉利、大众]
现在我构建了第二个 TreeMap,其中字符串作为键,整数作为值。字符串是公司的所有汽车名称,整数是它们被租赁的次数。
我如何轻松地迭代第一个 map 以节省第二个 map 中的租用汽车数量?第一个 Map 中的 ArrayList 给我带来了问题。
感谢您的帮助!
在这部分我将数据放入第二个Map中。 course 是第一个 Map 的名称,numberOfCars 是第二个 Map 的名称。
int helpNumber = 0;
for (Iterator<String> it = course.keySet().iterator(); it.hasNext(); ){
Object key = it.next();
if(course.get(key).contains(chooseName)){
helpNumber++;
}
System.out.println((course.get(key).contains(chooseName)));
}
if(helpNumber == 1) {
numberOfCars.put(chooseName, 1);
} else if(helpNumber > 1) {
int increasing = numberOfCars.get(chooseName);
increasing++;
numberOfCars.put(chooseName, increasing);
}
在下面的部分中,我尝试以这种方式打印它:
宝马:3大众:2奥迪:0马自达:0
因此,相同租赁金额的组放在一起,组内的汽车名称按字母顺序排序。
System.out.println("+++++++ car popularity +++++++");
Object helpKey = null;
for(Iterator<String> it = numberOfCars.keySet().iterator(); it.hasNext();) {
Object key = it.next();
if (helpKey == null){
helpKey = key;
}
if(numberOfCars.get(key) > numberOfCars.get(helpKey)) {
helpKey = key;
}
}
int maxCount = numberOfCars.get(helpKey);
for(int i = maxCount; i >= 0; i--) {
for(Iterator<String> it = numberOfCars.keySet().iterator(); it.hasNext();) {
Object key = it.next();
if(numberOfCars.get(key) == maxCount) {
System.out.println((String) key + ": " + numberOfCars.get(key));
}
}
}
最佳答案
[我还不能发表评论]由于您命名变量的方式,您提供的代码非常困惑。不要命名变量SomeType helpXxx
表明您需要有关此变量的帮助,如果您的代码正确呈现,人们将很容易区分哪些变量给您带来麻烦以及原因。
您收到的评论是正确的,即您需要根据您遇到的具体问题提出问题,而不是“帮助我获取此值”。您的具体问题是当值的类型为 Collection 时,迭代 Map 中包含的值。
也就是说,因为我需要代表来逃避新用户堆栈交换 jail ,所以这是您的解决方案:
import java.util.*;
public class Test {
public static void main(String[] args) {
String[] customers = {
"Mr PoopyButtHole", "Stealy", "Bird Person"
};
CarBrand audi = new CarBrand("Audi");
CarBrand bmw = new CarBrand("BMW");
CarBrand mazda = new CarBrand("Mazda");
CarBrand vw = new CarBrand("VW");
CarBrand ferrari = new CarBrand("Ferrari");
// First Map: Customers paired with car brands they've rented
SortedMap<String, List<CarBrand>> customerRentals =
new TreeMap<String, List<CarBrand>>();
// --- Fill the first map with info ---
// For customer Mr PoopyButtHole
List<CarBrand> mrPBHRentals = new ArrayList<>();
Collections.addAll(mrPBHRentals, audi, bmw, mazda);
customerRentals.put(customers[0], mrPBHRentals);
// For customer Stealy
List<CarBrand> stealyRentals = new ArrayList<>();
Collections.addAll(stealyRentals, bmw, mazda, vw);
customerRentals.put(customers[1], stealyRentals);
// For customer Bird Person
List<CarBrand> birdPersonRentals = new ArrayList<>();
Collections.addAll(birdPersonRentals, audi, bmw, mazda, ferrari);
customerRentals.put(customers[2], birdPersonRentals);
// First Map contains 10 occurences of car brands across all the individual
// arraylists paired to a respective customer
// Second Map: Car brands paired with the amount of times they've been
// rented
// You don't actually need the second map to be a TreeMap as you want to
// rearrange the results into your desired format at the end anyway
Map<CarBrand, Integer> carBrandRentalCounts = new HashMap<>();
// Place each CarBrand into carBrandRentalCounts and initialize the counts
// to zero
carBrandRentalCounts.put(audi, 0);
carBrandRentalCounts.put(bmw, 0);
carBrandRentalCounts.put(mazda, 0);
carBrandRentalCounts.put(vw, 0);
carBrandRentalCounts.put(ferrari, 0);
// Get all the values (each ArrayList of carbrands paired to a customer) in
// the first map
Collection<List<CarBrand>> values = customerRentals.values();
// Iterate through 'values' (each ArrayList of car brands rented)
int total = 0;
for(List<CarBrand> aCustomersRentals : values)
for(CarBrand brand : aCustomersRentals) {
// Get the current count for 'brand' in the second map
Integer brandCurrentCount = carBrandRentalCounts.get(brand);
// Increment the count for 'brand' in the second map
Integer newBrandCount = brandCurrentCount+1;
carBrandRentalCounts.put(brand, newBrandCount);
total++;
}
// Init. a List with the entries
Set<Map.Entry<CarBrand,Integer>> entries = carBrandRentalCounts.entrySet();
List<Map.Entry<CarBrand,Integer>> listOfEntries =
new ArrayList<Map.Entry<CarBrand,Integer>>(entries);
// Sort the entries with the following priority:
// 1st Priority: Highest count
// 2nd Priority: Alphabetical order
// NOTE: CustomSortingComparator implements this priority
Collections.sort(listOfEntries, new CustomSortingComparator());
// Print the results
System.out.println("Count of rentals for each car brand:");
for(Map.Entry<CarBrand, Integer> entry : listOfEntries)
System.out.println(" " + entry.getKey() + " --> " + entry.getValue());
System.out.println("Total:" + total);
// Verify that our custom sorted entries are indeed being sorted correctly
// Change the counts to be all the same
for(Map.Entry<CarBrand, Integer> entry : entries)
entry.setValue(10);
// Resort the entries
Collections.sort(listOfEntries, new CustomSortingComparator());
// Print with the test entries
System.out.println();
System.out.println("With test entries where all counts are the same:");
for(Map.Entry<CarBrand, Integer> entry : listOfEntries)
System.out.println(" " + entry.getKey() + " --> " + entry.getValue());
System.out.println("Total:" + total);
// Change the counts so that the ordering is the alphabetically highest
// brands followed by the lowest
for(int i = listOfEntries.size()-1; i >= 0; i--)
listOfEntries.get(i).setValue(i);
// Resort the entries
Collections.sort(listOfEntries, new CustomSortingComparator());
// Print with the test entries
System.out.println();
System.out.println("with test entries where the \"bigger\" car brands " +
"alphabetically have higher counts:");
for(Map.Entry<CarBrand, Integer> entry : listOfEntries)
System.out.println(" " + entry.getKey() + " --> " + entry.getValue());
System.out.println("Total:" + total);
}
}
class CustomSortingComparator
implements Comparator<Map.Entry<CarBrand,Integer>> {
public int compare(Map.Entry<CarBrand, Integer> entry1,
Map.Entry<CarBrand, Integer> entry2) {
CarBrand brand1 = entry1.getKey();
CarBrand brand2 = entry2.getKey();
int brandResult = brand1.compareTo(brand2);
Integer count1 = entry1.getValue();
Integer count2 = entry2.getValue();
int countResult = count1.compareTo(count2);
return
countResult > 0 ?
-1 : countResult < 0 ?
1 : brandResult < 0 ? // <-- equal counts here
-1 : brandResult > 1 ?
1 : 0;
}
}
// DONT WORRY ABOUT THIS CLASS, JUST MAKES IT EASIER TO IDENTIFY WHAT'S GOING
// ON IN THE FIRST MAP
class CarBrand implements Comparable<CarBrand> {
public final String brand;
public CarBrand(String brand) { this.brand = brand; }
@Override
public int compareTo(CarBrand carBrand) {
return brand.compareTo(carBrand.brand);
}
@Override
public boolean equals(Object o) {
// IF o references this CarBrand instance
if(o == this) return true;
// ELSE IF o is of type CarBrand, perform equality check on field 'brand'
else if(o instanceof CarBrand) {
CarBrand obj = (CarBrand)o;
// IF the brands are equal, o is equal to this CarBrand
if(brand.equals(obj.brand)) return true;
}
return false;
}
@Override
public String toString() { return brand; }
@Override
public int hashCode() { return brand.hashCode(); }
}
Count of rentals for each car brand:
BMW --> 3
Mazda --> 3
Audi --> 2
Ferrari --> 1
VW --> 1
Total:10
With test entries where all counts are the same:
Audi --> 10
BMW --> 10
Ferrari --> 10
Mazda --> 10
VW --> 10
Total:10
with test entries where the "bigger" car brands alphabetically have higher counts:
VW --> 4
Mazda --> 3
Ferrari --> 2
BMW --> 1
Audi --> 0
Total:10
它可以编译并运行,无需任何更改或额外导入。
看起来您过度思考如何获得所需的结果,或者您没有很好地掌握 Map 类,因此只是在破解。我们都这么做了……12小时后我们都讨厌自己这么做。想清楚了:)
确定主要问题:迭代第一个映射中包含的所有值。
在掌握问题之前,不要陷入实现细节,又名:
代码中的不返回点是当您尝试计算第一个 map 的值中汽车品牌的出现次数并将这些计数存储到第二个 map 时。这是一个带有代码提示的“食谱”,可以帮助您处理它。
Collection<ArrayList<String>> eachCustomersRentals = CustomerRentals.values();
for(ArrayList<String> aCustomersRentals : eachCustomersRentals) {...}
{...}
首先嵌套一个增强的 for-each 循环来迭代a客户租赁如果您不知道如何实现自定义比较器来为您抽象出详细信息,那么您想要实现的输出排序将会非常非常困惑。如果您必须进行这种排序,请仔细阅读 Comparator 和 Comparable 接口(interface)文档 (Google Comparator/Comparable ),然后分析我是如何实现的。
关于java - 在 Java 中迭代 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44047814/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!