راهحلهای سؤالات مسابقهٔ دستگرمی Java کدکاپ ۷ در ادامه توضیح داده شدند. در صورتی که متوجه راهحلی نشدید، میتونید در بخش نظرات، سؤالات و ابهامهای خودتون رو مطرح کنید.
اگه راهحل دیگهای برای سؤالات دارید، خوشحال میشیم که راهحلتون رو در بخش نظرات با ما و دوستانتون به اشتراک بذارید.
برای حل این سؤال، صرفاً باید رشتهٔ Hello CodeCup n را در متد sayHelloToCodeCup برگرداند. n پارامتر ورودی متد است:
public static String sayHelloToCodeCup(int n) {
return "Hello CodeCup " + n;
}
همچنین، میتوان از متد format کلاس String استفاده کرد.
در این سؤال، ابتدا باید بررسی کرد که آیا رشتههای ورودی null یا خالی هستند یا خیر. اگر حداقل یکی از آنها null یا خالی باشد، باید مقدار صفر را برگرداند:
if (one == null || one.isEmpty() || two == null || two.isEmpty()) {
return 0;
}
در ادامه، اگر طول رشتهٔ اول را n و طول رشتهٔ دوم را m در نظر بگیریم، به ازای تمامی iها از 0 تا n-m باید بررسی کرد که آیا زیررشتهای از one که از اندیس i شروع میشود و تا i+m ادامه مییابد برابر با two است یا خیر:
int repeats = 0;
for (int i = 0; i <= one.length() - two.length(); i++) {
if (one.substring(i, i + two.length()).equals(two)) {
repeats++;
}
}
return repeats;
برای پیادهسازی متد transformException، میتوان ابتدا یک List از ExceptionProxyها در نظر گرفت. به ازای هر یک از Supplierهای موجود در لیست ورودی، متد get مربوط به Supplier را در یک بلوک try فراخوانی میکنیم. اگر Exception پرتاب شود، یک نمونه از ExceptionProxy با پیغام برابر با پیغام Exception پرتابشده و در غیر اینصورت، یک نمونه از ExceptionProxy با پیغام OK! را به لیست اضافه میکنیم. در نهایت، لیست را برمیگردانیم:
List<ExceptionProxy> result = new ArrayList<>();
for (Supplier<?> function : functions) {
String msg = "OK!";
try {
function.get();
} catch (Exception e) {
msg = e.getMessage();
}
ExceptionProxy ex = new ExceptionProxy(msg, function);
result.add(ex);
}
return result;
برای انجام محاسبات در هر مرحله بهصورت همروند، میتوان Supplierهای هر مرحله را در قالب تردهای مجزا اجرا کرد و با استفاده از متد join منتظر پایان آنها ماند. برای مثال، برای انجام محاسبات fs، میتوان بهصورت زیر عمل کرد:
List<Thread> threads = param.fs.stream().map(sup -> new RunnerThread(() -> {
sup.get();
}, String.valueOf(param.fs.indexOf(sup) + 1))).collect(Collectors.toList());
threads.forEach(t -> t.start());
threads.forEach(t -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
کلاس RunnerThread بهصورت زیر تعریف شده است:
class RunnerThread extends Thread {
public RunnerThread(Runnable r, String name) {
super(r, name);
}
@Override
public String toString() {
return this.getName();
}
}
روشهای متعددی برای پیادهسازی این سؤال وجود دارد. میتوان تعدادی ریپازیتوری و سرویس را پیادهسازی کرد. برای مثال، میتوان در یک سرویس مربوط به مشتریها، عملیات ساخت مشتری را بهصورت زیر انجام داد:
@Override
public CustomerCreateResult createCustomer(CustomerCreateParam customer) {
if (repository.existsByUserName(customer.getUsername())) {
return null;
}
CustomerEntity entity = repository.save(
CustomerEntity.builder()
.firstName(customer.getFirstName())
.lastName(customer.getLastName())
.username(customer.getUsername())
.build()
);
return new CustomerCreateResult(entity.getId());
}
در نهایت، میتوان در یک RestController یک route بهصورت زیر تعریف کرد:
@PostMapping(value = "/api/customers")
public ResponseEntity<Object> createCustomer(@RequestBody CustomerCreateParam customer) {
CustomerCreateResult result = customerService.createCustomer(customer);
if (result == null) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Username already taken");
}
return ResponseEntity.status(HttpStatus.CREATED).body(result);
}