## Arrays

Related slides on offer

No. 138

## Assignment to final variable?

 Q: In Figure 405, “Example: int array of primes ” a final variable primes is being declared. Despite the final modifier denoting constant values we see a whole bunch of assignments i.e. primes[0] = 2. Give an explanation. A: The variable primes carries a reference to an array. The final modifier declares this reference to become non-modifiable. Changing the array's values themselves is not being restricted. Consider: final int[] primes = new int[5]; primes[0] = 0; // O.k.: Changing first array value primes = new int[3]; // Error: Cannot assign a value to final variable 'primes'

No. 139

## Converting string arrays to HTML.

 Q: Consider an array of strings. As an example we provide a list of country names: final String[] countries = { "England" ,"France" ,"Germany" };An application is supposed to generate the following output: 
• England
• France
• Germany
Implement A class method strings2html(final String [] strings) as in: public class Stringarray2Html { /** * Create an unordered ... * ... */ static public String strings2html(final String [] strings) { ... return ...; } }Do not forget to provide appropriate Javadoc™ method and class documentation. You may want to reconsider Figure 46, “Maven javadoc:javadoc ”. Generating Javadoc™ HTML documentation from your project should yield a result like: Provide appropriate unit tests covering at least: An empty input array. An input array containing at least two strings. A: Maven module source code available at sub directory P/Sd1/Array/StringArray2Html below lecture notes' source code root, see hints regarding import. Online browsing of API and implementation.

No. 140

Q:

We want to estimate the amount of time being required driving a particular route. Consider the following example:

The route above may be dissected into several legs:

1. From starting point to motorway

4. Junction till destination

Each leg may have a different speed limit. We thus define:

public class Segment {

/**
* Indication a segment does not have any speed limit.
*/
static public final int NO_SPEED_LIMIT = 0;

/**
* The distance of the current leg in km.
*/
public final double distance;

/**
* The current leg's speed limit in km / h.
*/
public final int speedLimit;

/**
* Creating an (immutable) leg
*/
public Segment(final double distance, final int speedLimit) {
this.distance = distance;
this.speedLimit = speedLimit;
}
}

A given route will be defined by an array of segments:

final Segment[] route = new Segment[] {
new Segment(2.4, 50)
,new Segment(5, 100)
,new Segment(3.1, 50)
,new Segment(0.8, 30)
};

Implement a method duration(...) which allows for calculation the minimum expected time required with respect to speed limits along a given route.

/**
* Minimal time required when consequently traveling with the minimum of
* official speed limits and the driver's personal maximum speed. If a
* leg does not have any speed limit the value of personalSpeedLimit will
* be used for calculation instead.
*
* @param route The array of segments composing a route.
*
* @param personalSpeedLimit The drivers personal speed limit whether or
*        not official limits apply. Must be greater than 0.
*
* @return The minimal duration in (rounded) minutes with respect to all
*         speed limits. Must be a positive (non-zero) value.
*/
static public long duration(Segment[] route, int personalSpeedLimit) {
return 0; // TODO
}


Write Junit tests to cover different situations.

### Tip

You may want to start implementing a main() method example first to gain some experience:

public class Driver {
/**
* @param args unused
*/
public static void main(String[] args) {

final Segment[] route = new Segment[] {
new Segment(2.4, 50)
,new Segment(5, 100)
,new Segment(3.1, 50)
,new Segment(0.8, 30)
};
...

final long fullMinutes = ...;

System.out.println("Minimal duration:" + fullMinutes);
}

A:

No. 141

## Examinations and mark frequencies

Q:

Consider an examination resulting in the following list of marks:

 Participant no. Mark 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 1 3 3 5 4 1 2 2 4 3 2 3 3 1 5 3 4

You may represent this examination result by:

final int[] marks = {2,1,3,3,5,4,1,2,2,4,3,2,3,3,1,5,3,4};

Lecturers and participants may be interested in the distribution of marks i.e. their frequencies. Thus having marks in a range from 1 to 5 in the given example we'd like to create the following overview of marks:

Mark Frequency
1 3
2 4
3 6
4 3
5 2

Write a Java application which turning an array of participants' marks into a table of mark frequencies. For the given example the intended terminal output reads:

Mark|frequency
----+---------
1|3
2|4
3|6
4|3
5|2

Your application shall work for other marking schemes (i.e. marks ranging from -2 to 10) as well. Define a suitable class like:

public class MarkFrequencies {

public final int[] frequencyByMark;
public final int lowestMark;

public MarkFrequencies(final int[] markValues) {
...
}
}

The constructor is yet not implemented. Upon completion you may use class MarkFrequencies producing the previously detailed terminal output:

public static void main(String[] args) {

final MarkFrequencies markFrequencies =
new MarkFrequencies(new int[]{2,1,3,3,5,4,1,2,2,4,3,2,3,3,1,5,3,4});

// Create overview of marks:
//
System.out.println("Mark|frequency");
System.out.println("----+---------");

for (int i = 0; i < markFrequencies.frequencyByMark.length ; i++) {
System.out.println("   " + (markFrequencies.lowestMark + i) + "|" +
markFrequencies.frequencyByMark[i]);
}
}

providing appropriate unit tests beforehand.

### Tip

1. Get the maximum and minimum mark of all participants.

2. Create the int[] frequencyByMark array. Regard each mark value as an index value. So if the mark value range is e.g. {-2, -1, 0, 1, 2, 3} map these to index values {0, 1, 2, 3, 4, 5}. Then use each element from the list of marks as an index to this array and increment the respective index position accordingly.

After implementing your method extend your application to allow for being called from the command line like:

marking> mvn package
....
marking> java -jar target/marking-0.9.jar 2 1 3 3 5 4 1 2 2 4 3 2 3 3 1 5 3 4

Mark|frequency
----+---------
1|3
2|4
3|6
4|3
5|2

This requires evaluating the args parameter from your main(String[] args) method.

### Tip

1. Converting a string like "5" into an int value of 5 may be achieved using:

int value = Integer.valueOf()
2. The maven-shade-plugin already being configured inside your project's pom.xml allows for creating executable jar archives. Suppose a main(...) method exists in a class de.hdm_stuttgart.mi.marking.Marks:  Your project's pom.xml allows for defining this class to become the archive's executable method:

...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>3.1.0</version>
<configuration>
<transformers>
<manifestEntries>
<Main-Class>de.hdm_stuttgart.mi.marking.Marks</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
</goals>
</execution>
</executions>
</plugin>
...

Executing the mvn package phase will then create an executable jar archive as outlined above.

A:

The method int[] de.hdm_stuttgart.mi.marking.Marks.getFrequencies(int[] values) is being defined in a slightly more general way possibly being useful in similar situations as well. This way it becomes subject to unit testing:

public class AppTest {

@Test
public void testSingle() {
Assert.assertArrayEquals(
new int[]{1},
Marks.getFrequencies(new int[]{-3}));
}

@Test
public void testMultiple() {
Assert.assertArrayEquals(
new int[]{2, 1, 0, 0, 0, 2, 0, 3},
Marks.getFrequencies(new int[]{-3, 4 , 2, -2, 4, -3, 2, 4}));
}
}