与字符串数组关联的数组中的最小数字

时间:2016-11-03 17:00:21

标签: java arrays loops continue

我已经搜索了所有关于找到数组中最小数字的问题;但是,我找不到任何具有与单独的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

但似乎无法找到显示相关名称的方法(所以我甚至不知道这段代码是否会让我更接近或更进一步)。我最接近的是尝试继续循环...但它只与时间[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"

我还试图与时间[i ++]进行比较,导致错误,并且不确定与整个数组进行比较的另一种方式,并保持名称与正确的时间相关联(我找到了很多方法来解除正确的关联名称和时间)。如何将正确的名称与最短的时间关联起来。下一阶段也将向亚军展示;但是,我希望一旦我获得第一名的人和时间,我就能弄清楚...我发现的唯一的例子只涉及一个数组,多数组的东西似乎已经把我抛出了一个循环!

6 个答案:

答案 0 :(得分:1)

在数组中找到最小值:

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]);

答案 1 :(得分:1)

真正的答案
停止使用小丑解决方案并开始使用对象。 创建一个包含名称和时间的对象。 停止使用数组。 将新对象类型存储在List中(LinkedList可能没问题,如果需要随机访问List,请使用ArrayList。)

你想要的答案 使用两个数组存储关于一个项目的相关数据是一个很好的解决方案。 找到最短时间和相关名称的简单解决方案:

  1. 找到最低时间的索引。
  2. 由于数组的顺序相同,因此请使用该索引值从奇妙的单独名称数组中检索名称。

答案 2 :(得分:0)

使用变量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

答案 3 :(得分:0)

假设您的名称数组的索引与您的时间数组的索引相关联

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
}   

答案 4 :(得分:0)

您可以将名称和时间放在一个类中,创建对象并将其放在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));

答案 5 :(得分:0)

试试这个

    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