与字符串数组关联的数组中的最小数字
Posted
技术标签:
【中文标题】与字符串数组关联的数组中的最小数字【英文标题】:lowest number in an array associated with a string array 【发布时间】:2016-11-03 17:00:20 【问题描述】:我已经搜索了所有我能找到的数组中的最小数;但是,我找不到任何将数组与单独的 String 数组关联的示例。我有两个数组,一个是名称数组,第二个是时间数组(int)。我想要一个显示最短时间的结果以及达到那个时间的人。
这是我必须使用的骨架:
class Marathon
public static void main (String[] arguments)
String[] names ="Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"
;
int[] times =341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299,343, 317, 265
;
for (int i = 0; i < names.length; i++)
System.out.println(names[i] + ": " + times[i]);
我能够编写一些代码来获得最短的时间:
public class Test
public static void main (String[] args)
String[] names = new String[] "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"
;
int[] times = new int[] 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265
;
int win = times[0];
for(int i=0; i< names.length; i++)
if (times[i] < win)
win = times[i];
System.out.println("names[i]" + ": " + win);
// result "names[i]: 243
但似乎找不到显示关联名称的方法(所以我什至不知道这段代码是否让我更接近或更远)。我最接近的是尝试一个 continue 循环......但它只与 times[0] 直接比较,我收到的所有结果都小于 341。
public class Marathon
public static void main (String[] args)
String[] names = new String[] "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"
;
int[] times = new int[] 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265
;
for (int i = 1; i < names.length; i++)
if (times[i] >= times[0]) continue;
System.out.println(names[i]+ ": " + times[i]);
//Result:
//"Thomas: 273
//Hamilton: 278
//Suzie: 329
//Emma: 275
//John: 243
//James: 334
//Daniel: 299
//Aaron: 317
//Kate: 265"
我还尝试与 times[i++] 进行比较,导致错误,并且不确定与整个数组进行比较并保持名称与正确时间相关联的另一种方法(我找到了很多方法来解除正确的关联姓名和时间)。我如何才能将正确的名称与最短的时间联系起来。下一阶段也将展示亚军;但是,我希望一旦获得第一名的人和时间,我就能弄清楚...我在任何地方找到的唯一示例仅涉及一个数组,多个数组的事情似乎让我陷入了循环!
【问题讨论】:
if (times[i] < times[win]) win = i;
然后使用times[win]
和names[win]
。
使用Map
,比数组好很多。
我确信有很多方法可以处理同样的问题;然而,由于这是一项任务(某种意义上的),我不得不处理所给的内容。我正在尝试学习 Java,尽管这可能与我以前的一些项目相比有所退步,但我正在尝试回到最基础的地方并逐步提高,类似于如果我会发生的情况在学校学过 Java... 甚至在我的 CIS 学位课程中提供了它。从有十几个类、数据库和接口的大型项目开始,我一下子就搞砸了。
【参考方案1】:
真正的答案 停止使用小丑解决方案并开始使用对象。 创建一个包含名称和时间的对象。 停止使用数组。 将新的对象类型存储在 List 中(LinkedList 可能很好,如果您需要随机访问 List,请使用 ArrayList)。
你想要的答案 使用两个数组来存储一个项目的相关数据是一个很好的解决方案。 查找最低时间和相关名称的简单解决方案:
-
查找最低时间的索引。
由于数组的顺序相同,因此使用该索引值从非常独立的名称数组中检索名称。
【讨论】:
【参考方案2】:假设你的名字数组的索引与你的时间数组的索引相关联
public static void main (String[] args)
String[] names = new String[] "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"
;
int[] times = new int[] 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265
;
int win = times[0];
int winningIndex = 0;
for(int i=0; i< names.length; i++)
if (times[i] < win)
win = times[i];
winningIndex = i;
System.out.println(names[winningIndex] + ": " + times[winningIndex]);
// result "John: 243
【讨论】:
为两个数组命名索引并将其设置为“i”正是我所缺少的!我一直在查看数组 []。感谢您的帮助!【参考方案3】:在数组中找到最小值:
int[] array ...
int min = Integer.MAX_VALUE;
int index = -1;
for (int i=0 i<array.length; i++)
if (array[i] > min)
index = i;
min = array[i];
System.out.println(names[index]);
【讨论】:
【参考方案4】:使用变量min
存储times[]
中具有最低值的索引。遍历数组times
一次,因为这决定了判断。在迭代过程中,检查times
中的当前元素是否小于索引min
处的元素。如果是,则将当前索引分配给min
。
int min = 0;
for(int i=0; i<times.length; i++)
if(times[i] < times[min])
min = i;
System.out.println("Lowest time is of "+names[min]+
", the time being "+times[min]);
输出:
Lowest time is of John, the time being 243
【讨论】:
【参考方案5】:您可以将名称和时间放入一个类中,创建对象并将其放入ArrayList
,然后根据time
对其进行排序。以下面的代码为例。
public static void main(String[] args)
List<Node> list = new ArrayList<>(Arrays.asList(new Node("Elena", 341),
new Node("Thomas", 273), new Node("Hamilton", 278)));
Collections.sort(list);
for (Node node : list)
System.out.println(node.name + " " + node.time);
// Implement Comparable or pass Comparator interface.
// here I have used implementing interface. :)
static class Node implements Comparable<Node>
String name;
int time;
Node(String name, int time)
this.name = name;
this.time = time;
@Override
public int compareTo(Node o) // will sort based on time
return Integer.compare(this.time, o.time);
Java 8 风格,
list.stream()
.sorted()
.forEach(i -> System.out.println(i.name + " " + i.time));
【讨论】:
【参考方案6】:试试这个
String[] names = new String[] "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily",
"Daniel", "Neda", "Aaron", "Kate" ;
int[] times = new int[] 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265 ;
int minIndex = IntStream.range(0, times.length).boxed().min((a, b) -> times[a] - times[b]).get();
System.out.println(minIndex + " " + times[minIndex] + " " + names[minIndex]);
TreeMap<Integer, String> sortedMap = IntStream.range(0, times.length).collect(TreeMap<Integer, String>::new,
(map, i) -> map.put(times[i], names[i]), Map::putAll);
System.out.println(sortedMap.firstEntry());
输出
8 243 John
243=John
【讨论】:
以上是关于与字符串数组关联的数组中的最小数字的主要内容,如果未能解决你的问题,请参考以下文章
PHP 数组遍历方法大全(foreach,list,each)