2014-10-07 4 views
2

Вы получаете пользовательский ввод строки из четырех положительных целых чисел ex "0 1 1 2", чтобы увидеть, есть ли две пары в строке. Объект IntegerPairs будет иметь конструктор, который не принимает аргументов и следующие два метода:Тестирование для двух пар в заданной строке

public void setPairString(String str) - Этот метод примет строку в качестве аргумента, а затем сохранит ее в переменной экземпляра.

public boolean hasTwoPairs() - Это вернет true, если в строке присутствуют только две пары.

Вы можете использовать сканер на строке, а также на System.in. Он работает одинаково, но конструктор берет строку, а не System.in.

После того, как вы закончили сканирование, обязательно позвоните по номеру {your scaner variable name}.close(); Не бойтесь делать локальные переменные. Вы можете использовать их для хранения чисел, которые вы получаете из строки.

Это мой проект, и я ужасно потерян ... Не хочу, чтобы кто-то делал это для меня, конечно, но я хотел бы получить хотя бы немного больше инструкций по этому поводу. Мой код до сих пор: (не очень много на всех, и я сижу здесь озадачены в течение 3-4 часов подряд)

Мой класс:

public class IntegerPairs { 

private String str; 

public IntegerPairs(String pairs){ 
    str = pairs; 
} 
public void setPairString(String str){ 
    this.str = str; 
} 
public boolean hasTwoPairs(){ 

Понятия не имею, что делать для логического метода. Я предполагаю, что мне нужно сделать петлю где-то ????

Даже не попал в основной класс, потому что мне нужно сначала разобраться в этом.

EDIT

Это было больше, что я искал:

IntegerPairs общественного класса {

private String theString; 

public IntegerPairs() { 

} 

public void setPairString(String str) { 
    theString = str; 
} 

public boolean hasTwoPairs() { 
    String a = theString.substring(0, 1); 
    String b = theString.substring(1, 2); 
    String c = theString.substring(2, 3); 
    String d = theString.substring(3, 4); 

    boolean isThereTwopairs = (a.equals(b) && c.equals(d)) ? true 
      : ((a + b).equals(c + d)) ? true : false; 
    return isThereTwopairs; 
} 

}

Тогда главный класс:

импорт java.util. *;

общественного класса Main {

public static void main(String[] args) { 
    IntegerPairs Str = new IntegerPairs(); 
    Scanner keyboard = new Scanner(System.in); 
    System.out.print("Please enter 4 numbers:"); 
    String pairIn = keyboard.nextLine(); 
    keyboard.close(); 
    Str.setPairString(pairIn); 
    boolean isThereTwoPairs = Str.hasTwoPairs(); 
    String whatToPrint = (isThereTwoPairs == true) ? "There Are Two Pairs" 
      : "There Are Not Two Pairs"; 
    System.out.print(whatToPrint); 

} 

}

Взял меня некоторое время, но, наконец, получил его. Мой следующий вопрос: я запускаю тест Junit, но он говорит мне, что «у недавно созданного объекта IntegerPairs не должно быть двух пар», ip.hasTwoPairs());

Не совсем уверен, что это значит, потому что у моего конструктора нет заданий.

ответ

1

То, что вы должны сделать, это использовать loop и if statementto compare every character to every othercharacter in the string и use a counter когда пара найдена, но если счетчик не равен двум, вы должны сделать логическое значение для возврата false. Ваш логический метод должен проверять счетчик, и все.

+0

Две пары, как в двух двойных числах, так например. «1 1 2 2» или «3 3 4 4» для проверки требуется строка из 4 символов (с пробелами) из 4 положительных целых чисел и посмотреть, есть ли две пары в пределах этих 4 целых чисел. Итак, если есть две пары (все 4 числа), она вернет true, и если только одна пара будет по-прежнему ложной. – JR7676

+0

Итак, если счетчик не равен двум, логический метод должен возвращать значение false. Как насчет принятия моего ответа, если вы считаете его достойным. – rert588

1

Одним из решений для этого было бы разделить ваши String пространствами и поместить каждый токен в Map<String, Integer>, где ключ является токеном, а значение - счетом.

Вот быстрый & грязный пример:

String input = "0 1 1 2"; 
// splitting on space 
String[] split = input.split(" "); 
// initializing map 
Map<String, Integer> map = new HashMap<String, Integer>(); 
// iterating over split 
for (String s: split) { 
    // token already present: incrementing its count 
    if (map.containsKey(s)) { 
     map.put(s, map.get(s) + 1); 
    } 
    // token not there yet: putting count as 1 
    else { 
     map.put(s, 1); 
    } 
} 
// initializing counter for # of pairs 
int pairsCounter = 0; 
// iterating counts 
for (Integer i: map.values()) { 
    // a count == 2 is a pair: increasing count of pairs 
    if (i == 2) { 
     pairsCounter++; 
    } 
} 
// printing output: do we have exactly 2 pairs? 
System.out.printf("Input contains 2 numerical pairs? %b%n", pairsCounter == 2); 

Выход

Input contains 2 numerical pairs? false 
1

Если вы работаете с цифрами, вы должны сохранить их в int, double и т. Д. Я бы рекомендовал вам сделать это в конструкторе, после чего вы можете легко проверить, являются ли первые два числа парами, и делать то же самое для второго два числа.

2

Нужно ли разрешать это через конструкторы? Кажется, что regex - идеальный ключ.

Ниже приведено одно, ** не изящное & быстро запеченное **, раствор. Наслаждаться.

общественного класса Успех {

static int f = 4; //declare a static variable that may suffer modifications below 

public static void main(String[] args) { 


    String input = JOptionPane.showInputDialog("Insert, please, 4 digits!"); // the input may be any character 
    int one= input.replaceAll("[^1]", "").length(); //using regex and the length() method, we count for how many times the digit 1 is repeated in our String: input. The result is stored in int one 
    int two= input.replaceAll("[^2]", "").length(); // the same here, for digit 2 
    int three= input.replaceAll("[^3]", "").length(); // the same, for digit 3 
    int four= input.replaceAll("[^4]", "").length(); // the same, for digit 4 
    int five= input.replaceAll("[^5]", "").length(); // the same, for digit 5 
    int six= input.replaceAll("[^6]", "").length(); // the same, for digit 6 
    int seven= input.replaceAll("[^7]", "").length(); // the same, for digit 7 
    int eight= input.replaceAll("[^8]", "").length(); // the same, for digit 8 
    int nine= input.replaceAll("[^9]", "").length(); // the same, for digit 9 
    int zero= input.replaceAll("[^0]", "").length(); // the same, for digit 0 

    if(one == 2){ // if the stored result in int one, from the operation above is 2, then we have a pair in the inputted String 

     f = f-2; // thus, we remove 2 from f (f was declared above as static, 4). The point is if f, by the end of those if statements will be equal to 0, then our String has 2 pairs of digits 
    } 
    if(one == 3){ // if the stored result in int one, from the operation above is 3, then we have a pair in the inputted String 

     f = f-2; // thus, we remove 2 from f 
    } 

    if(one == 4){ // if the stored result in int one, from the operation above is 4, then we have two pairs in the inputted String 
     f=f-4; 
    } 
    if(two == 2){ 

     f = f-2; 
    } 

    if(two == 4){ 
     f=f-4; 
    } 
    if(two == 3){ 

     f = f-2; 
    } 
    if(three == 2){ 

     f = f-2; 
    } 

    if(three == 4){ 
     f=f-4; 
    } 
    if(three == 3){ 

     f = f-2; 
    } 
    if(four == 2){ 

     f = f-2; 
    } 

    if(four == 4){ 
     f=f-4; 
    } 
    if(four == 3){ 

     f = f-2; 
    } 
    if(five == 2){ 

     f = f-2; 
    } 

    if(five == 4){ 
     f=f-4; 
    } 
    if(five == 3){ 

     f = f-2; 
    } 
    if(six == 2){ 

     f = f-2; 
    } 

    if(six == 4){ 
     f=f-4; 
    } 
    if(six == 3){ 

     f = f-2; 
    } 
    if(seven == 2){ 

     f = f-2; 
    } 

    if(seven == 4){ 
     f=f-4; 
    } 
    if(seven == 3){ 

     f = f-2; 
    } 
    if(eight == 2){ 

     f = f-2; 
    } 

    if(eight == 4){ 
     f=f-4; 
    } 
    if(eight == 3){ 

     f = f-2; 
    } 
    if(nine == 2){ 

     f = f-2; 
    } 

    if(nine == 4){ 
     f=f-4; 
    } 
    if(nine == 3){ 

     f = f-2; 
    } 
    if(zero == 2){ 

     f = f-2; 
    } 

    if(zero == 4){ 
     f=f-4; 
    } 
    if(zero == 3){ 

     f = f-2; 
    } 

    if (f == 0) { 
     JOptionPane.showMessageDialog(null, "There are TWO pairs!"); 
    } else if (f == 2) { 
     JOptionPane.showMessageDialog(null, "There is only ONE pair!"); 

    } else if (f == 4) { 
     JOptionPane.showMessageDialog(null, "There are NO pairs!"); 

    } 

}

+0

Я честно не знаю, как использовать регулярное выражение. Я нахожусь в классе Java для начинающих, и я не думаю, что мы дошли до этого момента ...Однако нам нужно использовать конструктор. Будет ли я использовать регулярное выражение в основном классе или классе объектов? Я делаю здесь выстрел, что мне нужно будет сделать что-то вроде этого: String str = "1 1 2 2"; Строковые разделители = ""; String [] str2 = str.split (разделители); – JR7676

+0

А это превратит его в массив разделенных строк? Итак, каждый номер будет отдельной строкой правильно? Извините, что я действительно новичок в этом и не знаю, как комментировать мой код в правильном формате на этом сайте. – JR7676

+0

Скоро я отредактирую свой ответ выше и опубликую решение, следите за обновлениями. – Insanovation

1

Так первая вещь:

IntegerPairs объект будет иметь конструктор, который не принимает никаких аргументов

Но ваш конструктор принимает аргумент.

Теперь к решению. Попробуйте реализовать следующий алгоритм:

  1. Разбить строку, используя пространство «» в качестве разделителя Подсказка: посмотрите at the documentation for String.split()

  2. Результатом является массив из расщепленных строк. Вы можете вставить чек, если действительно есть четыре элемента. Если вы не хотите: пропустите эту точку

  3. Тогда вы можете просто проверить, равны ли первый и второй элементы, а третий и четвертый элементы равны, поскольку это единственный возможный способ иметь две пары.

Удачи!

+0

1 2 1 2, также имеет две пары, даже если одни и те же целые числа не находятся в последовательных позициях индекса, когда вы заменяете пробелы пустой строкой. Проверьте свою третью инструкцию еще раз. – rert588

+0

@ rert588 это более гибкое определение пары - я предположил, что они должны быть смежными. Не могу понять это, прочитав исходное сообщение еще раз, но если им не нужно быть рядом, вы можете сначала отсортировать массив, а затем применить шаг 3. – UniversE

 Смежные вопросы

  • Нет связанных вопросов^_^