Java Rätsel

Da es hier schon lange kein Rätse mehr gab; hier ein kleines von meiner Seite,...

Es geht um die Berechnung einer Kreditkarten-Quersumme nach dem Module-10-Algorithmus. Wir hatten mal die Anforderung, eine Karte unseres Loyaltysystems zu validieren. Das war ja eher ein ge-copy-paste aus dem Internet. Die nächste Anforderung war, die nächste gültige Nummer zu bekommen.

Die Aufgabe darin besteht eine möglichst elegante/einfache Möglichkeit zur Berechnung der nächsten gültigen Nummer zu formulieren

Hier die Source:
Code:
package test;

public class CheckSum {
	public static boolean validateCheckSum(String inData) {
		char[] c = null;
		char[] d = null;
		int sum = 0;
		int checksum = 0;
		StringBuffer digits = new StringBuffer();

		// isolate digits
		c = inData.toCharArray();
		for (int i = 0; i < c.length; i++) {
			if (Character.isDigit(c[i])) {
				digits.append(c[i]);
			}
		}

		// calculate sum
		int nr = 0;
		d = digits.toString().toCharArray();
		for (int i = 0; i < d.length - 1; i++) {
			nr = i + 1;
			if (nr % 2 == 0) {
				sum += Character.digit(d[i], 10) * 3;
			} else {
				sum += Character.digit(d[i], 10);
			}
		}

		// validate check sum
		if ((10 - (sum % 10)) == 10) {
			checksum = 0;
		} else {
			checksum = 10 - (sum % 10);
		}

		if (checksum == Character.digit(c[(d.length - 1)], 10)) {
			return true;
		}

		return false;
	}

	public static String getNextNumber(String inLatest) {
		// your approach here
		return null;
	}

	public static void main(String[] args) {
		String latestNumber = "1009";
		System.out.println("Is " + latestNumber + " valid? " + validateCheckSum(latestNumber));
		System.out.println("Is 1018 the next number? " + "1018".equals(getNextNumber(latestNumber)));
	}
}

Ausgabe:
Is 1009 valid? true
Is 1018 the next number? false

Und wehe, es macht jemand einfach return "1018" :P

hf
slowy
 
Zuletzt bearbeitet:
Hallo,

danke für das Rätsel :)

Ich nehme mal an, dass die Aufgabe darin besteht eine möglichst elegante/einfache Möglichkeit zur Berechnung der nächsten gültigen Nummer zu formulieren, oder? Das steht leider nicht soooo explizit drin ;-)

Gruß Tom
 
Angenommen es gibt die Klassen Othello, welche das Interface Comparator wie folgt implementiert:

Code:
public class Othello implements Comparator<String> {
	public int compare(String s1, String s2) {
		return s2.compareTo(s1);
	}
}

Was ergibt demnach folgender System.out.println und weshalb:

Code:
		String[] s = {"map", "pen", "marble", "key"};
		Arrays.sort(s, new Othello());
		System.out.println(Arrays.binarySearch(s, "key"));
 
Hallo zusammen,

ich hätte mal wieder ein neues Rätsel.

Gegeben ist folgender Java Code:

Java:
public static void main(String args[]) {
	Integer a1 = 50;
	Integer b1 = 50;
	Integer a2 = 500;
	Integer b2 = 500;

	System.out.println(a1 == b1);
	System.out.println(a2 == b2);
}

Und die folgende zugehörige Ausgabe:

Code:
true
false

Erkläre, wie es zu dieser Ausgabe kommt! :)

Viele Grüße,
MAN
 
Habe folgendes rausgefunden:
Code:
		Integer a1 = 127;
		Integer b1 = 127;
		Integer a2 = 128;
		Integer b2 = 128;

		System.out.println(a1 == b1);
		System.out.println(a2 == b2);

		a1 = new Integer(127);
		b1 = new Integer(127);
		a2 = new Integer(128);
		b2 = new Integer(128);

		System.out.println(a1 == b1);
		System.out.println(a2 == b2);
		
		a1 = Integer.valueOf(127);
		b1 = Integer.valueOf(127);
		a2 = Integer.valueOf(128);
		b2 = Integer.valueOf(128);
		
		System.out.println(a1 == b1);
		System.out.println(a2 == b2);

true
false
false
false
true
false
Ab 128 inklusive wird's auf einmal false. Gleich verhält es sich, wenn ich mit "valueOf" arbeite, verwende ich den Konstruktor, ist es immer false.
Erklärung habe ich aber keine dazu - und finde, das ist gemein-gefährlich ;)

Gruss
slowy
 
Ja, das ist schon klar. Mit gemeingefährlich meine ich vorallem: wenn ich eine TestCase schreibe mit Werten unter 128, ist der TestCase grün. Das kann dann in der Produktion ziemlich nerven kosten. Jetzt könnte man sagen, man muss halt auch mit mehreren Werten testen, aber dieser "Switch" könnte ja auch erst ab 65k auftreten... naja, bin gespannt auf die Antwort, dann wird alles Sinn machen ;)
 
Zurück